Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Паттерны и приемы! (https://javascript.ru/forum/misc/24396-patterny-i-priemy.html)

Livaanderiamarum 28.12.2011 16:18

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 146845)
+1
Зачем создавать метод, который будет вызван всего один раз (а потом ещё и самоликвидируется)? Лучше сразу сделать анонимную функцию, которая будет собирать и возвращать объект.

покажи твою версию реализации этого примера

B@rmaley.e><e 28.12.2011 16:26

myToolbox = (function () {
	var o = {
		css: function (el, prop) { /*return css-prop*/
		},
		ajax: function (options) { /*make ajax-request*/
		}
	};
	var cache = {};
	o.getCache = function () {
		return cache
	};
	return o;
})();

myToolbox.ajax({
	url: "foo",
	async: true
}); //ajax-req.
myToolBox.css(document.body, "width"); // some width
myToolbox.getCache(); // {}
typeof myToolbox.cache // undefined.

GuardCat 28.12.2011 17:26

А «o» несёт какую-нибудь смысловую нагрузку? Или можно делать так:
myToolbox = (
	function () {
		var cache = {};
		return {
			css: function (el, prop) { 
				/*return css-prop*/
			},
			ajax: function (options) { 
				/*make ajax-request*/
			},
			getCache: function () {
				return cache
			}
		};
	}
)();

?
Мне так читать проще.

melky 28.12.2011 17:41

B@rmaley.e><e так код труднее читать (минимум, только мне). когда функции приведены похожим списком, они как-то легче усваиваются. плюс, неужели так тяжела инициализация и удаление свойства у объекта?

минусом объекта с инициализатором является, конечно, плохая его усваиваемость, если программист не понимает, с чем имеет дело. потом идёт все как по маслу.

и ещё один минусом будет использование одной "приватной" переменной несколькими функциями. для этого инициализирующийся объект не предназначен, а вот анонимная исполняющаяся функция - как раз для этого подходит!

GuardCat, приведённая вами одноразовая фабрика объектов - золотая середина между самоисполняющейся функцией и самоинициализирующемся объектом. )

Livaanderiamarum 28.12.2011 17:46

Цитата:

Сообщение от melky
так код труднее читать (минимум, только мне). когда функции приведены похожим списком, они как-то легче усваиваются. плюс, неужели так тяжела инициализация и удаление свойства у объекта?

+1

Livaanderiamarum 28.12.2011 18:00

Цитата:

Сообщение от melky (Сообщение 146870)
пиши в одно сообщение.
это то же самое, что и вариант GuardCat.

удали свое сообщение я удалил вопрос "чем код лучше"

B@rmaley.e><e 28.12.2011 19:18

Цитата:

Сообщение от Livaanderiamarum
чем твой код лучше?

Тем, что там нет самоудаляющейся функции и используется более привычная большинству концепция самовызывающихся функций.
Цитата:

Сообщение от GuardCat
А «o» несёт какую-нибудь смысловую нагрузку?

В моём примере — нет. Оно написано так только для сохранения исходного стиля.
Цитата:

Сообщение от melky
B@rmaley.e><e так код труднее читать (минимум, только мне).

А увидев код вроде
var a = ({
 // сотни тысяч строк кода
Чем, Вы подумаете, будет a? Особенно если Вы программируете на JS пару месяцев и ещё не прочитали JavaScript Patterns Стефанова? Если (function () стало более-менее стандартным синтаксисом (и то постоянно появляются вопросы в духе "Что значит (function () {})") для самовызвающихся функций, то ({ … }) не столь сильно распространено (Хотелось бы увидеть примеры его использования в каких-нибудь приличных библиотеках или JS приложениях).

Далее: IDE. Если среда и догадается каким-нибудь образом о структуре создаваемого объекта (очевидно не в исходном случае, т.к. там понять, куда будет записан объект, без анализа графа потока управления вряд ли получится). А уж догадаться о том, что метод в любом случае будет удалён и, как результат, его не нужно подставлять в какой-нибудь автокомплит, ещё труднее.
Цитата:

Сообщение от melky
неужели так тяжела инициализация и удаление свойства у объекта?

Проблема не в их легкости / тяжёлости, а в том, что непонятно, зачем их объявлять вместе с объектом, если они не будут частью него. Если бы этот метод назывался clone и делал то, что должен делать исходя из названия, вопросов бы не было. Получился бы такой объект-прототип, копию которого всегда можно получить.

melky 28.12.2011 19:40

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 146901)
А увидев код вроде
var a = ({
 // сотни тысяч строк кода
Чем, Вы подумаете, будет a?

ваш пример некорректен. инициализирующая функция не возвращает результат. она только удаляет себя и инкапсулирует создаёт переменную в глобальной области.

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 146901)
Особенно если Вы программируете на JS пару месяцев и ещё не прочитали JavaScript Patterns Стефанова?

с этим проблема, да. но это я уже расписал в своём сообщении выше.


Цитата:

Сообщение от B@rmaley.e><e (Сообщение 146901)
(Хотелось бы увидеть примеры его использования в каких-нибудь приличных библиотеках или JS приложениях).

oops... с этим проблема.

НО! активность использования каких-либо шаблонов проектирования не говорит о том, что "этот шаблон хороший, а этот плохой". все они реализуют одно и то же. Единственное, выбор человек делает в пользу вкуса. и поставленной задачи.

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 146901)
Далее: IDE. Если среда и догадается каким-нибудь образом о структуре создаваемого объекта (очевидно не в исходном случае, т.к. там понять, куда будет записан объект, без анализа графа потока управления вряд ли получится).

хм. т.е. вы хотите сказать, что IDE не поймёт кода и не подставит заверщение имени переменной в этом случае ?

a = {
    test : "nice",
    magic : function(){
        return this.te*!*<CTRL+SPACE>*/!*
    }
};


PS Komodo Edit, как помню, всё отлично понимал. это было год назад.

B@rmaley.e><e 28.12.2011 19:56

Цитата:

Сообщение от melky
она только удаляет себя и инкапсулирует создаёт переменную в глобальной области.

Этот подход тем более плох. Не надо решать за пользователя, куда записывать объект.
Цитата:

Сообщение от melky
вы хотите сказать, что IDE не поймёт кода и не подставит заверщение имени переменной в этом случае ?

Да. Возьмите свой исходный код, добавьте его в проект, а в соседнем файле наберите myToolbox.<Ctrl+Space>. Я буду сильно удивлён, если это сработает (и ещё больше, если при этом init'а не будет).

Livaanderiamarum 29.12.2011 00:38

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 146910)
Этот подход тем более плох. Не надо решать за пользователя, куда записывать объект.Да. Возьмите свой исходный код, добавьте его в проект, а в соседнем файле наберите myToolbox.<Ctrl+Space>. Я буду сильно удивлён, если это сработает (и ещё больше, если при этом init'а не будет).

вижуал студио справился) нетбенс 701 справился


Часовой пояс GMT +3, время: 03:47.