Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / DRY проблема / 4 сообщений из 4, страница 1 из 1
12.02.2013, 05:45
    #38147090
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRY проблема
Есть у нас в коде вот такие повторяющиеся коды:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var Element = function() {
   // содержит всякие простые данные, например строковые или числовые, например: count: 16
   var options = { .. };
  
   // содержит всякие привязки к UI, например кнопочки
   var ui = {...};

   // содержит функции, которые оперируют с полями объектов options и ui
   var methods = {
      ... 
   };
};

// Регистрируем элемент
Elements.add("MyElement", Element);

...

// Создаем элемент
Elements.createMyElement();



В идеале, хотелось бы делать как-то вот так:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
Elements.add("MyElement", {
   options: {...},
   ui: {...},
   methods: {.. /* работает с options и ui */ ..}
});

Elements.createMyElement();



но что-то до сих пор не могу придумать, как такое реализовать. Потому спрашиваю, это возможно?

То есть тут получается нужно ленивое вычисление методов, ибо в них основная проблема, ui и options не зависят друг от друга.
...
Рейтинг: 0 / 0
12.02.2013, 14:17
    #38147757
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRY проблема
Граждане! Подскажите хоть что-нибудь!
...
Рейтинг: 0 / 0
12.02.2013, 14:31
    #38147783
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRY проблема
Сторонними фреймворками пользуешься? - В jQuery так это и реализовано.
А если ручками, то типа такого можно:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var Elements = function(){
    function add(name){
        var argsLength = arguments.length;
        for (var i = 0; i < argsLength; i++){
            //тут анализируем аргументы на принадлежность их объектам (или массивам) и что куда относить
            //далее создаем требуемый объект Element
            //аргумент под номером 0 - это name, надо не забыть проверку поставить
        }
    }
}


Не знаю, правильно ли я понял вопрос: сделать заполнение параметров динамическим и упростить работу с объектом.
...
Рейтинг: 0 / 0
12.02.2013, 21:07
    #38148544
scymaks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DRY проблема
IDVsbruck,

Нет, не совсем.
Вот например:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
var FirstElement = function() {
   var options = { 
       updatePeriod: 10,
       itemsPerPage: 15
   };
  
   // содержит всякие привязки к UI, например кнопочки
   var ui = {
       reloadButton: $("#reloadButton"),
       nextPageButton: $("#nextPage")
   };

   // содержит функции, которые оперируют с полями объектов options и ui
   var methods = {
         initialize: function() {
              methods.loadPage();

              ui.reloadButton.click(function(event) {
                   methods.loadPage();
              });
         },
         loadPage: function() {
              $.get('http://mysite.com/api/get-page?page=' + options.itemsPerPage, function(response)  {
                  ...
              });
         }
   };
};

Elements.register('FirstElement', FirstElement);

...

Elements.createFirstElement(..);



Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
var SecondElement = function() {
   var options = { 
       theme: 'major',
       feed_size: 10
   };
  
   // содержит всякие привязки к UI, например кнопочки
   var ui = {
       addNewsButton: $("#addButton"),
   };

   // содержит функции, которые оперируют с полями объектов options и ui
   var methods = {
         initialize: function() {
              methods.loadNews();

              ui.addButton.click(function(event) {
                   ...
              });
         },
         loadNews: function() {
              $.get('http://mysite.com/api/get-news', function(response)  {
                  ...
              });
         }
   };
};

Elements.register('SecondElement', SecondElement);

...

Elements.createSecondElement(..);



Хочется "упростить" до вот такого:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Elements.register('FirstElement', {
    options: { 
       updatePeriod: 10,
       itemsPerPage: 15
   },
   ui: {
       reloadButton: $("#reloadButton"),
       nextPageButton: $("#nextPage")
   },
   methods: {
         initialize: function() {
              methods.loadPage();

              ui.reloadButton.click(function(event) {
                   methods.loadPage();
              });
         },
         loadPage: function() {
              $.get('http://mysite.com/api/get-page?page=' + options.itemsPerPage, function(response)  {
                  ...
              });
         }
   }
});

...

Elements.createFirstElement(..);



Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Elements.register('SecondElement', {
   options: { 
       theme: 'major',
       feed_size: 10
   },
   ui: {
       addNewsButton: $("#addButton"),
   },
   methods: {
         initialize: function() {
              methods.loadNews();

              ui.addButton.click(function(event) {
                   ...
              });
         },
         loadNews: function() {
              $.get('http://mysite.com/api/get-news', function(response)  {
                  ...
              });
         }
   }
});

...

Elements.createSecondElement(..);
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / DRY проблема / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]