Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Рационализация функции (https://javascript.ru/forum/misc/33438-racionalizaciya-funkcii.html)

Harvey 23.11.2012 11:17

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

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

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. Скажите пожалуйста, насколько это типично для классического хорошего программирования?

Спасибо!

ksa 23.11.2012 11:50

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

ksa 23.11.2012 11:53

Цитата:

Сообщение от Harvey
я очень часто в текущем проекте применяю оператор switch

Вполне нормальный оператор... Другое дело когда и как его применять. :)

P.S.
Сам мало использую такого типа управляющие структуры и функции...

nerv_ 23.11.2012 12:03

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

Harvey 23.11.2012 14:54

Цитата:

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

ksa, не могли бы объяснить на примере?


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

nerv_ , ага, читал, но не хочется заново переписывать проект)

ksa 23.11.2012 15:23

Цитата:

Сообщение от Harvey
не могли бы объяснить на примере?

Что именно из перечистенного?

Harvey 23.11.2012 15:41

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

:)

ksa 23.11.2012 16:06

Цитата:

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

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

Ты же сам писал про некую "общую часть"
Цитата:

Сообщение от Harvey
Я написал другую функцию, которая избавлена от дублирования кода

Или забыл уже? :)

ksa 23.11.2012 16:08

Цитата:

Сообщение от 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>'

Этого "добрища" у тебя валом! Зачем его всякий раз повторять?


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