Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.11.2012, 09:17
Аспирант
Отправить личное сообщение для Harvey Посмотреть профиль Найти все сообщения от Harvey
 
Регистрация: 19.08.2011
Сообщений: 61

Рационализация функции
Привет друзья!

Поделитесь, пожалуйста опытом. Есть функция, которая определяет тип поля и выводит соответствующую ему верстку. Выглядит функция так.

switch(type){
                case 'textfield':
                    var textfield = '<label class="field-title" for="">' + title + '<span title="Обязательно для заполнения." class="form-required">' + required + '</span></label><input type="textfield" id="" value="" /><label class="error"></label><div class="description">' + element.description + '</div>';
                    if (operation == 'create') {return '<div class="field-textfield" data-id="' + relationIDGenerator.getID() + '">' + textfield + '</div>}'}
                    else if (operation == 'modify') {$('.form-preview [data-id = ' + relID + ']').html(textfield);} break;
                case 'checkbox':
                    var checkbox = '<label class="field-title" for="' + fieldIDGenerator.num + '">' + title + '<span title="Обязательно для заполнения." class="form-required">' + required + '</span></label><input type="checkbox" id="' + fieldIDGenerator.getID() + '" /><label class="error"></label><div class="description">' + element.description + '</div>';
                    if (operation == 'create') {return '<div class="field-checkbox" data-id="' + relationIDGenerator.getID() + '">' + checkbox + '</div>'}
                    else if (operation == 'modify') {$('.form-preview [data-id = ' + relID + ']').html(checkbox);} break;
                case 'checkboxgroup':
                    var checkboxgroup = '<label class="field-title" for="">' + title + '<span title="Обязательно для заполнения." class="form-required">' + required + '</span></label>' + options('checkbox') + '<label class="error"></label><div class="description">' + element.description + '</div>';
                    if (operation == 'create') {return '<div class="field-checkboxgroup" data-id="' + relationIDGenerator.getID() + '">' + checkboxgroup + '</div>'}
                    else if (operation == 'modify') {$('.form-preview [data-id = ' + relID + ']').html(checkboxgroup);} break;
                case 'radio':
                    var radio = '<label class="field-title" for="">' + title + '<span title="Обязательно для заполнения." class="form-required">' + required + '</span></label>' + options('radio') + '<label class="error"></label><div class="description">' + element.description + '</div>';
                    if (operation == 'create') {return '<div class="field-radio" data-id="' + relationIDGenerator.getID() + '">' + radio + '</div>'}
                    else if (operation == 'modify') {$('.form-preview [data-id = ' + relID + ']').html(radio);} break;
                case 'select':
                    var select = '<label class="field-title" for="">' + title + '<span title="Обязательно для заполнения." class="form-required">' + required + '</span></label><select>' + options('select') + '</select><label class="error"></label><div class="description">' + element.description + '</div>';
                    if (operation == 'create') {return '<div class="field-select" data-id="' + relationIDGenerator.getID() + '">' + select + '</div>'}
                    else if (operation == 'modify') {$('.form-preview [data-id = ' + relID + ']').html(select);} break;
                case 'textarea':
                    var textarea = '<label class="field-title" for="">' + title + '<span title="Обязательно для заполнения." class="form-required">' + required + '</span></label><textarea></textarea><label class="error"></label><div class="description">' + element.description + '</div>';
                    if (operation == 'create') {return '<div class="field-textarea" data-id="' + relationIDGenerator.getID() + '">' + textarea + '</div>'}
                    else if (operation == 'modify') {$('.form-preview [data-id = ' + relID + ']').html(textarea);} break;
            }


Подскажите пожалуйста, как наиболее грамотно составить функцию, выполняющую эти задачи? В данном случае функция получается гибкой, но в тоже время повторяющегося кода довольно много. Я написал другую функцию, которая избавлена от дублирования кода, но показалось что у нее слишком высокий порог вхождения, и программеру, который, вероятно, будет работать с моим кодом, будет сложно разобраться, да и самому возвращаться к ней будет не просто. Как найти золотую середину? Может все же стоило оставить короткую функцию, избавленную от дублирования?
Есть ли смысл тут использовать ООП? Если да, приведите, пожалуйста, пример.
И еще, я очень часто в текущем проекте применяю оператор switch. Скажите пожалуйста, насколько это типично для классического хорошего программирования?

Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 23.11.2012, 09:50
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,350

Что касается меня:
- сделал бы общую часть некой функцией
- всю "дата-часть" занёс бы в некий объект
- птом просто брал значение из некоего экземпляра того объекта
Ответить с цитированием
  #3 (permalink)  
Старый 23.11.2012, 09:53
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,350

Сообщение от Harvey
я очень часто в текущем проекте применяю оператор switch
Вполне нормальный оператор... Другое дело когда и как его применять.

P.S.
Сам мало использую такого типа управляющие структуры и функции...
Ответить с цитированием
  #4 (permalink)  
Старый 23.11.2012, 10:03
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

http://habrahabr.ru/post/112843/
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 23.11.2012, 12:54
Аспирант
Отправить личное сообщение для Harvey Посмотреть профиль Найти все сообщения от Harvey
 
Регистрация: 19.08.2011
Сообщений: 61

Сообщение от ksa Посмотреть сообщение
Что касается меня:
- сделал бы общую часть некой функцией
- всю "дата-часть" занёс бы в некий объект
- птом просто брал значение из некоего экземпляра того объекта
ksa, не могли бы объяснить на примере?


http://habrahabr.ru/post/112843/

nerv_ , ага, читал, но не хочется заново переписывать проект)
Ответить с цитированием
  #6 (permalink)  
Старый 23.11.2012, 13:23
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,350

Сообщение от Harvey
не могли бы объяснить на примере?
Что именно из перечистенного?
Ответить с цитированием
  #7 (permalink)  
Старый 23.11.2012, 13:41
Аспирант
Отправить личное сообщение для Harvey Посмотреть профиль Найти все сообщения от Harvey
 
Регистрация: 19.08.2011
Сообщений: 61

- сделал бы общую часть некой функцией

Ответить с цитированием
  #8 (permalink)  
Старый 23.11.2012, 14:06
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,350

Сообщение от Harvey
- сделал бы общую часть некой функцией
Так смотри какой текст у тебя одинаковый у всех... Оформляй функцией... Плюс параметры какие-то добавь...

Ты же сам писал про некую "общую часть"
Сообщение от Harvey
Я написал другую функцию, которая избавлена от дублирования кода
Или забыл уже?
Ответить с цитированием
  #9 (permalink)  
Старый 23.11.2012, 14:08
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 13,350

Сообщение от Harvey
<label class="field-title" for="">' + title + '<span title="Обязательно для заполнения." class="form-required">' + required + '</span></label>
Сообщение от Harvey
<label class="error"></label><div class="description">' + element.description + '</div>'
Этого "добрища" у тебя валом! Зачем его всякий раз повторять?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 08:09
Как в браузерах реализуются функции DOM (например createElement) iamme Общие вопросы Javascript 7 02.09.2011 19:26
динамическое содержимое функции alfmaster Общие вопросы Javascript 2 28.05.2011 16:10
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 15:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 03:03