用清晰度编码让它清晰明了

2017-10-31 10:06



         工作代码不一定是好的代码。您的代码还需要易于阅读,理解和修改。它需要清晰,并且要实现这一点,它必须组织得很好,仔细规划和正确分离想法之前,你甚至打开你的代码编辑器。清晰的编码是将伟大的开发人员与仅仅是好的分开的东西,并且有一些基本原则可以让你在这条路上。

一.单一责任原则

         想象一下,你正在做一个家庭项目,你拿起一个钻头,把螺丝钉插入墙上。当您将钻头从螺丝上拉出时,您会发现此钻具有一个有趣的特点:它在驱动螺丝上喷出一个快干的干墙复合物,以将其隐藏起来。那么,如果你想画上螺丝,那太好了,但事实并非如此。你不应该得到第二次演习,只是为了在某事中钻一个洞。如果只是做了一件事情,那么这个演练会更加可用和可靠,而且在各种情况下也可以灵活运用。
        单一责任原则指出,代码块应该做一件事情,做得好。像上面的演练一样,限制其功能实际上增加了一个代码块的有用性。编码这样不仅可以节省你很多的头痛,而且会为项目中的未来开发人员节省很多头痛。
        在责任方面考虑职能和方法。当您增加其职责时,代码块变得不那么灵活可靠,对更改的要求更高,更容易出错。最清楚的是,每个功能或方法应该有一个责任。
        如果你正在描述一个功能是什么,你必须使用单词“and”,那个函数可能太复杂了。什么功能应该足够简单,只用描述性函数名称和描述性参数来解释。    
       最近我的任务是创建Myers-Briggs个性测试的电子版本。我以前做过,当我几年前第一次接触到这个问题时,我编码了一个巨大的功能,称为processForm-it收集分数,生成图表,并且在DOM中处理所有内容以向用户显示内容。200的X- 200 X- 200 X- 200 X- 200 X- 200 X- 200 X- 200 X- 200 X-45 X- 200 200 另外,如果在功能中间出现问题,找到错误就很难了。所以当这个时候面对这个问题的时候,我将所有的东西都分解成一个模块对象中的单一责任函数。结果函数调用表单提交如下所示:
return {
processForm: function() {
getScores(); calculatePercentages();
createCharts();
showResults();
}
};

非常容易阅读,理解和修改 - 即使是非编码器也可以理解这一点。而且每个功能都是(你猜到的!)只有一件事情。这是行动中的单一责任原则。如果我想添加表单验证,而不是修改一个巨大的工作功能(可能会破坏它),我可以简单地添加一个新的方法。这种方法还可以将相关的逻辑和变量分段,减少冲突以实现更高的可靠性,并且如果需要,可以很容易地将功能重用于其他目的。

所以记住:一个功能,一个责任。大功能是类隐藏的地方。如果一个函数做了很多紧密结合在一起的工作,并且使用相同的数据,那么用方法把它分解成一个对象就更有意义了,就像我用大的函数一样。
命令查询分离
     
我见过的最有趣的电子邮件David Thorne关于一只失踪的猫的失踪小姐海报每当他的同事香农要求时,大卫都会遵守,但是对自己的一点点扭转,并提供与预期不同的东西。交换是非常有趣,值得一读,但是当你的代码做同样的事情时,这并不那么有趣。
        命令查询分离提供了保护代码免受意外副作用的基础,以避免在调用函数时出现意外。功能分为两类:执行操作的命令查询,这回答一个问题。你不应该混合它们。考虑以下功能:
 
function getFirstName() {
var firstName = document.querySelector("#firstName").value;
firstName = firstName.toLowerCase();
setCookie("firstName", firstName);
if (firstName === null) {
return "";
}
return firstName;
}
var activeFirstName = getFirstName();

函数名称,getFirstName告诉我们该函数将返回名字。但是,它的第一件事就是将该名称转换为小写。该名称表示它正在获得某些东西(一个查询),但它也会改变数据的状态(一个命令) - 一个从功能名称不清楚的副作用。
      
        
更糟糕的是,该功能会在没有告诉我们的情况下设置一个名字的cookie,可能覆盖我们可以指望的东西。查询功能永远不应该覆盖数据。一个很好的经验法则是,如果你的函数回答一个问题,它应该返回一个值,而不是改变数据的状态。相反,如果你的函数做某事,它应该改变数据的状态,而不是返回一个值。为了最大程度地清楚,函数不应该返回一个值改变数据的状态。
 
以上代码的更好版本将是:
function getFirstName() {
var firstName = document.querySelector("#firstName").value;
firstName = firstName.toLowerCase();
setCookie("firstName", firstName);
if (firstName === null) {
return "";
}
return firstName;
}
setCookie("firstName", getFirstName().toLowerCase());
        这是一个基本的例子,但希望您能看到这种分离如何澄清意图和防止错误。随着函数和代码库变大,分离变得更加重要,因为只要查找它所做的功能并不能有效地利用任何人的时间,那么只要您想要使用它,就可以使用功能定义。
松耦合
        考虑一个拼图和乐高块之间的区别。有了拼图,只有一种方法可以把它们放在一起,只有一种成品。使用乐高,您可以将任何方式放在一起,以达到您想要的最终效果。如果你不得不选择这些类型的建筑块之一来工作,才知道你将要建造什么,你会选择哪一种?
     
        耦合是衡量一个程序单元依赖于其他程序单位的量度。耦合(或紧耦合)太多是刚性的,应该避免。这是拼图游戏。我们希望我们的代码是灵活的,像乐高块。这是松耦合,它通常导致更大的清晰度。

        请记住,代码应该足够灵活以涵盖各种用例。如果您发现自己复制和粘贴代码并进行微小的更改,或重写代码,因为代码在其他地方更改,这是紧密耦合的行动。(例如,为了使getFirstName以前功能可重用,可以用firstName传递给函数的通用ID 替换硬编码)。其他标志包括功能中的硬编码ID,功能参数太多,多个类似功能,违反单一责任原则的大功能。

       紧密耦合在一组函数和变量中最为普遍,这些函数和变量实际上应该是一个类,但是当类依赖于其他类的方法或属性时也可能发生。如果你在功能上有相互依赖关系的问题,可能是考虑把你的功能分解成一个类的时候了。
     
        当看到一些代码进行一系列交互式拨号时,我遇到了这个问题。表盘有许多变量,包括尺寸,手柄尺寸,支点尺寸等。因此,开发人员被迫使用荒谬的功能参数或创建每个功能的多个副本,每个功能中的变量都是硬编码的。此外,每个拨号盘在进行互动时都会有所不同。这导致三组几乎相同的功能 - 每个拨盘一个。简而言之,由于变量和行为的硬编码,耦合增加,所以像拼图一样,只有一种方法把这些块放在一起。代码库不必要地复杂。

        我们通过将功能和变量分解成为三个拨号盘中的每一个实例化的可重用类来解决问题。我们设置类作为输出参数的函数,因此当个别拨号对象被实例化时可以配置不同的结果。因此,我们的功能较少,变量只存储在一个位置,使更新更容易。
     
        彼此相互作用的课程也可能是紧耦合的罪魁祸首。假设我们有一个类可以创建另一个类的对象,比如可以创建学生的大学课程。我们的CollegeCourse班工作正常 但是,我们需要在Student的构造函数中添加一个参数不好了!现在我们必须修改我们的CollegeCourse课程来解释课堂上的变化Student
var CollegeCourse = (function() {
function createStudent_WRONG(firstName, lastName, studentID) {
/*
If the Student constructor changes, we'll have to modify this method and
all calls to it, too!
*/
}
function createStudent_RIGHT(optionsObject) {
/*
Passing an object as an argument allows the Student object to deal with
the change. We may need to change this method, but we won’t need to change any
existing calls to it.
*/
}
}());
关键是你应该建立你的代码,如乐高块,而不是拼图。如果您发现自己面临类似上述问题,问题可能就是紧密联系。

如果我们的代码不能立即清楚,则会出现问题。实现清晰度远远超过适当的缩进 - 从项目开始就要仔细规划。虽然很难掌握,遵循单一责任原则,命令查询分离,松散耦合和高度凝聚力可以​​大大提高代码的清晰度。在任何重要的规划项目中都应该考虑一下。

    


服务支持

我们珍惜您每一次在线询盘,有问必答,用专业的态度,贴心的服务。

让您真正感受到我们的与众不同!

合作流程
合作流程

重庆网站建设流程从提出需求到网站建设报价,再到网站建设,每一步都是规范和专业的。

常见问题
常见问题

什么是网站定制?网站报价如何?网站常见问题。

常见问题
售后保障

网站建设不难,难的是一如既往的热情服务及技术支持。我们知道:做网站就是做服务,就是做售后。