Показать сообщение отдельно
  #1 (permalink)  
Старый 23.11.2012, 11: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. Скажите пожалуйста, насколько это типично для классического хорошего программирования?

Спасибо!
Ответить с цитированием