出于可读性目的,在函数中嵌套辅助函数

Nesting helper functions inside a function for readability purposes

所以我目前正在通读 Clean Code,我真的很喜欢超小函数的想法,每个函数都告诉自己 "story"。我也非常喜欢他提出的代码应该如何编写以便根据 "TO paragraphs" 阅读的方式,我决定在脑海中将其重命名为 "in order to"

无论如何,我一直在重构大量代码以包含更有意义的名称并使读取代码的流程更好一些,我偶然发现了一些我不确定的东西,也许这里的一些专家可以提供给我一些中肯的建议!

我知道代码样式是一个极具争议性和主观性的话题,但希望我不会被这个 post 所困扰。

谢谢大家!

PSA:我是一个菜鸟,刚从大学毕业,目前正在实习期间使用 MEAN 堆栈为内部项目创建一个网络应用程序。

Clean Code 重构

 //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);
    }
  }

MEANjs 有时使用第二种方法(例如使用回调)。我个人认为,如果您不打算在 main 函数之外使用这些助手,那就太好了。

在这里发布 IIFE 示例,以便我有更多的工作空间。我并不是说这是最好的选择,我会根据 OP 给我们的信息使用它。

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();

这样辅助函数只被定义一次并且在闭包中保持私有。如果您更喜欢 function x() 样式,可以移除 var x = function x 语法。

编辑:如果函数只被调用一次,您自己的示例可能是更简洁的代码。您使用 IIFE 语法的原因是让辅助函数只能由主函数访问,就像您自己的第二个示例一样。