2016-07-13 13 views
0

Так что я сейчас читаю Clean Code, и мне очень нравится идея супер маленьких функций, каждая из которых рассказывает свою собственную «историю». Мне также очень нравится, как он пишет, как писать код, чтобы читать его в терминах «ТО абзацев», которые я решил переименовать в «0» дляВложенные вспомогательные функции внутри функции для удобства чтения

В любом случае, я был рефакторинг много кода, чтобы включить более значимые имена и сделать поток, в котором он будет читаться немного лучше, и я наткнулся на то, о чем я не уверен, и, возможно, некоторые гуру здесь могут дать мне солидный совет!

Я знаю, что код-стили является весьма спорной и субъективной темой, но, надеюсь, я не буду получать развернутый из этого поста.

Спасибо всем!

PSA: Я ноб, свежий из колледжа, создающего веб-приложение, использующее стек MEAN для внутреннего проекта в рамках стажировки на данный момент.

Чистый код рефакторинг

//Modal Controller stuff above. vm.task is an instance variable 
vm.task = vm.data.task; 
castTaskDataTypesForForm(); 

    function castTaskDataTypesForForm() { 
    castPriorityToInt(); 
    castReminderInHoursToInt(); 
    castDueDateToDate(); 
    getAssigneObjFromAssigneeString(); 
    } 

    function castPriorityToInt() { 
    vm.task.priority = vm.task.priority === undefined ? 
     0 : parseInt(vm.task.priority); 
    } 

    function castReminderInHoursToInt() { 
    vm.task.reminderInHours = vm.task.reminderInHours === undefined ? 
     0 : parseInt(vm.task.reminderInHours); 
    } 

    function castDueDateToDate() { 
    vm.task.dueDate = new Date(vm.task.dueDate); 
    } 

    function getAssigneObjFromAssigneeString() { 
    vm.task.assignee = getUserFromId(vm.task.assignee); 
    } 

Возможно лучше рефакторинг?/Мой вопрос ----------------------------

//Modal Controller stuff above. vm.task is an instance variable 
vm.task = vm.data.task; 
castTaskDataTypesForForm(); 

    function castTaskDataTypesForForm() { 
    castPriorityToInt(); 
    castReminderInHoursToInt(); 
    castDueDateToDate(); 
    getAssigneObjFromAssigneeString(); 

    function castPriorityToInt() { 
     vm.task.priority = vm.task.priority === undefined ? 
     0 : parseInt(vm.task.priority); 
    } 

    function castReminderInHoursToInt() { 
     vm.task.reminderInHours = vm.task.reminderInHours === undefined ? 
     0 : parseInt(vm.task.reminderInHours); 
    } 

    function castDueDateToDate() { 
     vm.task.dueDate = new Date(vm.task.dueDate); 
    } 

    function getAssigneObjFromAssigneeString() { 
     vm.task.assignee = getUserFromId(vm.task.assignee); 
    } 
    } 
+0

Возможно, лучше не определять помощников внутри функции, так как они будут воссозданы каждый раз, когда вызывается основная функция. В зависимости от вашей архитектуры скройте их в том же объеме, что и в первом примере. Или используйте IIFE, чтобы создать закрытие вокруг них, чтобы помощники оставались частными. Или поставьте их на прототипе модуля, содержащего основную функцию (если она существует). Не зная структуры остальной части вашего кода, я бы пошел на IIFE. – Shilly

+0

Удивительно, спасибо за то, что вы дали мне возможность заглянуть! Никогда не слышал о IIFE, глядя в них сейчас, чтобы посмотреть, какие у него есть. Также из-за того, как это используется и его архитектура, это можно и только вызывает один раз. Поэтому, если их воссоздать, это не проблема. – Michael

+0

@Shilly, если хотите, отправьте ответ и я его приму. – Michael

ответ

0

Публикация примера IIFE здесь, поэтому у меня больше возможностей для работы. Я не говорю, что это лучший вариант, это тот, который я использовал бы с информацией, которую дал нам ОП.

var castTaskDataTypesForForm = (function() { 
    var castPriorityToInt = function castPriorityToInt() { ... }, 
     castReminderInHoursToInt = function castReminderInHoursToInt() { .. }, 
     castDueDateToDate = function castDueDateToDate() { ... }, 
     getAssigneObjFromAssigneeString = function getAssigneObjFromAssigneeString() { ... }; 
    return function castTaskDataTypesForForm() { 
     castPriorityToInt(); 
     castReminderInHoursToInt(); 
     castDueDateToDate(); 
     getAssigneObjFromAssigneeString(); 
    }; 
}()); 
vm.task = vm.data.task; 
castTaskDataTypesForForm(); 

Таким образом, вспомогательные функции определяются только один раз и сохраняются в закрытом помещении. Вы можете исключить синтаксис var x = function x, если вы предпочитаете стиль функции x().

edit: Если функция вызвана только один раз, ваши собственные примеры, вероятно, являются более чистым кодом. Причина, по которой вы будете использовать синтаксис IIFE, будет заключаться в том, чтобы вспомогательные функции были доступны только основной функции, например, в вашем собственном втором примере.

+0

Очень интересно, да, я просто прочитал статью об этом, и кажется, что другим способом сделать это было бы буквально просто обернуть его в парне. Будучи в окне оставленного комментария Бога, я собираюсь вырезать много пуха, но (function castTaskDataTypesForForm() {...}()); Это получилось довольно красиво. То, как вы это делаете, более или менее одно и то же ... не так ли? Мне нравится, как вы явно вызываете функцию, должна ли быть определена функция перед вызовом? – Michael

+1

Я бы предпочел не использовать выражения функции для этого. Используйте регулярные функции, они лучше читают, менее склонны к глупым синтаксическим ошибкам, но все же правильно работают. – slebetman

+0

@slebetman Я согласен, я тоже не большой поклонник выражений функций. О чем я говорю в своем комментарии к этому, о чем вы говорите? (function castTaskDataTypesForForm() {...}()); – Michael

0

MEANjs иногда использует второй метод (например, с обратными вызовами) , Я лично считаю, что это хорошо, если вы не собираетесь использовать эти помощники вне основной функции.

+0

Спасибо за ответ, да, я думаю, в сочетании с ответом @Shilly с учетом того, будут ли они воссозданы или нет, именно то, что я искал. – Michael

 Смежные вопросы

  • Нет связанных вопросов^_^