在函数内嵌入辅助函数以实现可读性

时间:2016-07-13 14:06:36

标签: javascript optimization refactoring code-snippets

所以我目前正在阅读Clean Code,我非常喜欢超小功能的概念,每个功能都讲述自己的“故事”。我也非常喜欢他如何编写代码以便用“TO段落”来阅读的方式,我决定将其重命名为“为了”

无论如何,我一直在重构很多代码以包含更多有意义的名称,并使得它会被更好地阅读,我偶然发现了一些我不确定的东西,也许这里的一些大师可以给我一些坚实的建议!

我知道代码风格是一个极具争议性和主观性的主题,但希望我不会被这篇文章扩展出来。

谢谢大家!

PSA:我是一名新手,刚从大学毕业,在实习期间使用MEAN堆栈创建一个内部项目的Web应用程序。

清洁代码重构

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

2 个答案:

答案 0 :(得分:0)

MEANjs有时会使用第二种方法(例如使用回调)。我个人认为,如果你不打算在主要功能之外使用那些助手,那就太好了。

答案 1 :(得分:0)

在此发布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();

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

编辑:如果只调用一次函数,那么你自己的例子可能是更干净的代码。您使用IIFE语法的原因是保持辅助函数只能由main函数访问,就像您自己的第二个示例一样。