• 草原上的奔跑
    2019-01-16
    今天这篇内容很实用,我现在也有整理代码的习惯,但是只是用的都比较零散,不像本篇中这么系统,而且范老师给出了理论依据。代码块,人体接受信息的方式。有实践方法,有理论支撑,以后整理代码也会更有目标性,同时,在要求别人整理代码时,也会有理有据。最后说一句,看到写的排版很乱的代码,很影响阅读代码的心情,以及理解代码的速度。

    作者回复: 知道为什么乱,才好改。

    这一篇的最后一节,我们会总结一些编码规范方面的一些心理学知识。到时候,你在回头看看这一篇的文章,可能会有新的收获。

    编码规范比较杂,知道了背后的道理,运用的就自如些,方便些。

    
     7
  • Dream
    2019-01-17
    总感觉给出的一些理论,在现实开发有一些是没有必要的。如果每一篇就讲针对性很强的一段代码,不好吗,理论性的东西太多了,对实践转换率不强,

    作者回复: 嗯,我理解你的看法。这也是这个专栏不讨巧的地方。如果讲代码的话,我写的也轻松,你学的也带劲。其实,这也是我一直想和大家讨论的一个问题。

    讲代码很重要。但是,看再多的代码,就这一节来说,我觉得都不如知道“大脑按块接受信息”这个行为模式重要。理解了基础的理论,所有的规范都不用死记硬背,你还可以创造新规范、改进旧规范。

    有时候,我们对于一些规范很纠结,比如使用四个空格的缩进问题,比如if语句后要跟个括号的问题,也很难再实践中被遵守。为什么哪? 说白了,就是不知道不这样做的危害。很多公司有一套一套的规则,就是执行不了。为啥呢?大家根本不知道规则对自己有什么好处。

    编码规范这东西,随便网上找找,都是一大堆的规范。阿里的规范,Google的规范,Java的规范的规范,都可以找到,讲的比我们这个专栏要全要多。当我开始筹划这个专栏的时候,我给自己定下的目标,是让大家了解为什么;然后给一些例子,说明怎么办。理解了为什么,好多事情你自然就知道怎么办了,这样好多东西才可能成为你自己的东西,而不是我塞给你的东西。

    很可惜的是,这样做的确存在很大的问题:理论成了我要硬塞给你的东西。所以,理论这一块,有人可能就有点抗拒。🤣又让我学没用的理论!

    我们在看代码的时候,很少有人说,这是代码规范规定的,你必须这样改、那样改,按照规范改。这样说,可能没人愿意搭理我们。我们常说的是,这样看着不舒服,那样容易出问题,说的更多的是为什么。如果让我找一找为什么给出理论重要,也许更愉快地工作,算是一点吧。

     1
     4
  • 虢國技醬
    2019-01-20
    打卡
    我有一个自己在实践且感觉不错的经验,分享一下:
    举个栗子,我现在准备写一个控制器方法,我会先仔细想想要做一点什么?怎样的顺序?多想几次在脑袋里过一下,但是我不会深想到底怎么做,想好以后,我会先写注释(更准确说应该是提纲),以注释作为思路的引子同时也是一种代码实现思维的分块

    作者回复: 这个办法不错。我是在纸上各种画。

    
     3
  • _CountingStars
    2019-01-16
    因为每一个编辑器的制表符显示出来不一样 有点编辑器 把制表符展示为4个空格 有的编辑器把制表符展示为8个空格 不统一 不同编辑器显示效果不同 使用4个空格就没有这个问题
    
     3
  • hua168
    2019-03-10
    老师,像我这种没有项目经验,知道类、接口及其修饰符、方法,但不知道什么情况下使用:
    1. 接口:是抽象方法的集合,一个实现接口的类,必须实现接口内所描述的所有方法。
             理解是当有些方法规定死的就要用接口,比如人的身份证,设置名字、地址、性别等

    2. 类:类是一个模板,它描述一类对象的行为和状态。对象是类的实例化。
           访问控制修饰符:default、private、public、protected
           非访问修饰符:static、final、abstract(只能继承)、synchronized、transient
                         volatile
           继承、多态、
    3.方法: 语句的集合,它们在一起执行一个功能。

    这些基础概念都懂,但是就不知道怎么在项目中应用的,说懂好像又不懂,感觉基础不是很扎实一,我这种情况怎搞?有没有相关文章或书推荐一下,非常感谢?
    展开

    作者回复: 先要区分类和方法。在面向对象的设计中,类表示的是一个对象。比如人,身份,铅笔,钱包等。一般地,名词或者可以看作名词的词,需要用类来表示。

    方法,一般表示的是行为,也就是你说的执行一个功能。比如买菜,拖地,钓鱼,吃没吃过晚饭,有没有购房资格,都可以看作是行为或者判断。一般地,动词和形容词,或者类似的词,要用方法来表示。

    通常地,一句话,有主语、谓语、宾语,主语和谓语一般表示为类,而谓语就是连接两个类的方法。

    举个例子,“授权的用户可以登录服务系统”这句话里的词语有“授权的", “用户”,“登录”,“服务系统”。那么,“用户”和“服务系统”就可以设计成类,而“授权的”是“用户”这个类的一个方法。“用户”和“服务系统”这两个类里,要分别有方法处理“登录”这个行为。

    而Interface呢,一般用在高度抽象的场合。什么是高度抽象呢? 比如说,我们知道资源的使用最后应该关闭,那么“关闭”就可以是一个高度抽象的方法。 不管是什么资源,什么类,都可以有一个“关闭”的方法。实现了“关闭”接口的类,都可以调用“关闭”这个方法。 这里面有一个小问题就是,房屋的门可以实现“关闭”,下水管道也可以实现“关闭。可是,房屋和下水管道之间,并没有可以继承的关系。这时候,Interface就可以突破class的继承限制,多个没有继承关系的类,都可以实现Interface。一个类,只能继承一个父类,但是可以实现多个Interface。 比如说,class MySubClass extends MyClass implements Closeablse, Comparable {// snipped}。

    不知道市面上还有没有"面向对象软件构造"这本书。太厚了,可以当作工具书查阅。 另外,多看看、琢磨琢磨Java标准类库的设计。这些API的设计,用“苛刻”这个词形容一点都不过分。这些API的背后,有着大量的权衡和考量,大部分都经得住了时间的考验。琢磨琢磨这些API的设计方式,也是一个学习设计的好办法。

    
     2
  • 背着吉他的大漠狼
    2019-01-21
    老师,有的时候,在一个代码块里面逻辑较多,远远超过了25行,这个时候我们是在这个块里写完,还是再分块,分块了又使得同一个目标不同的代码块了,希望老师能看到

    作者回复: 一般来说,一个大的逻辑可以分成更小的逻辑,并列的小逻辑或者下层的小逻辑。这些小逻辑,可以分割成代码块,或者包装成方法。所以,一个大块里,你还可以再分小块。

    
     2
  • 蓝色波浪
    2019-01-18
    // conventional indentation
    int runningMiles = runningSpeedOne * runningTimeOne +
                       runningSpeedTwo * runningTimeTwo;
    这个是不是违背了在操作符前换行这个原则?

    作者回复: 是的。

    
     2
  • lianlian
    2019-01-16
    哈哈哈,我发现我写得很规范
    
     1
  • 空知
    2019-01-16
    老师可不可以多出些题目,可以结合实际练练手~~

    作者回复: 嗯,我找找实际的代码。

    就规范这一部分来说,你可以看看OpenJDK的String类的代码,或者其他基础类的代码,看看有什么可以改进的地方。 发现了问题,就给OpenJDK提交bug,提交补丁。

    JDK用的太广泛了,每一个微小的修改,都会用到几十亿台设备上,都很有价值。还能成为OpenJDK成员😊

    
     1
  • pyhhou
    2019-01-16
    专栏看到现在,很有收获,规范了自己之前没有想到的很多地方,满满的干货,谢谢老师~

    作者回复: 不谢,有收获就好。

    
     1
  • 听雨
    2019-10-23
    1)
    if (hiTail == null) {
        hiHead = e;
    }
    else {
        hiTail.next = e;
    }
    2)
    if (hiTail == null) {
        hiHead = e;
    } else {
        hiTail.next = e;
    }

    老师,这两种写法,哪种好呢
    展开

    作者回复: 我通常使用第二种。第二种规范推荐的多些。

    
    
  • 听雨
    2019-10-23
    感觉Oracle JDK在代码规范做的很差,基础集合里面方法都是一大片一大片的,if或者for不加花括号等等,看的心累

    作者回复: 收到;-)

    
    
  • hshayq
    2019-07-08
    我写Python一般都是在括号后换行,比如
    a = get(
        arg1,
        arg2,
        arg3
    )
    老师怎么看?
    展开

    作者回复: 挺好的。我建议在括号后换行,便于阅读和搜索,看到括号就知道这是一个方法或者函数。每个参数一行,这也是容易理解、视觉效果好的编排方式。

    
    
  • Sisyphus235
    2019-05-21
    留言里没有一条讨论习题的。。。

    Line 2 后面习惯空两行,表示 import 和代码块之间的区分;
    Line 8 后面空一行,表示注释的区分;
    Line 10 后面空一行,表示初始化的区分;
    Line 17 后面空一行,表示异常的区分;

    空格、空行、缩进都是很好的视觉手段,加上 IDE 提供的收起和展开功能往往能让开发者很直观的看到代码的意图。整理代码逻辑就能很好的分块,我一般代码会分为“基础校检”,“初始化”,“核心代码逻辑” *n,“LBYL”的异常处理等
    展开

    作者回复: “整理代码逻辑就能很好的分块”! 这个总结很棒!

    
    
  • 浅吟且行的未来
    2019-04-04
    赞老师,理论结合实际的方式很好!学到了原因,更容易理解规范!
    
    
  • hua168
    2019-03-08
    一个代码块只能有一个目标,有点疑问:
    1. 代码块是不是可以是类、接口、方法(函数)?

    2. 如果类和方法的话,是不是可以理解类是实现大目标,方法实现小目标?
       我实现一个类,要使用几好个方法,方法一定要独立的吗?

    3.方法和类的使用一直有点判断不了,在什么情况下使用类什么情况使用方法?
      我一个东西可以使用方法实现,也可以使用类实现,是不是能用方法就不用类?
    展开

    作者回复: 一个大目标可以分解为小目标,大问题分解为小问题,这就是为什么会有缩进的逻辑。

    方法独立的问题,我们后面还会谈到。 如果方法不独立,会有很多问题; 但是也做不到所有软件的所有方法都独立。

    类一般是一个名词,表示一个对象;而方法一般可以使用动词,表示一种行为。从需求中找名词、动词(主语、谓语、宾语,形容词)这是一个常用的面向对象设计的办法。比如,一个授权的客户可以查询他的账户余额,客户、账户、余额,都是对象,可以考虑设计成类,而授权、查询,都是行为,可以考虑设计成方法。该怎么授权呢? 又是一大堆的描述,这就是把大问题分解成小问题。

    行为也可以设计成类,比如授权当作名词看,就可以是个类。这种情况,需要复用设计,分离出抽象行为的时候用的比较多。

    
    
  • 湮汐
    2019-02-20
    老师,有些时候,因为方法名太长比如aaa.bbb().ccc().ddd()这种结构,换行是应该在“.”前面还是后面?

    作者回复: 两种方式都很常见,“.”前面换行的稍微多一点。

    
    
  • CGL
    2019-02-19
    Idea的ctrl shift enter了解一下

    作者回复: IDEA看来很多人爱啊

    
    
  • 黄朋飞
    2019-01-23
    换行后应该和表达式的哪部分对齐呢?

    作者回复: 如果有空间,双倍缩进或者缩进更多到和同级别的表达式对齐。只要多于双倍缩进,怎么好看怎么来。

    
    
  • xavier
    2019-01-22
    感谢老师的讲解。规范的目的是提高代码可读性,便于交流。这些规范不是死板的,每个人可以根据自己的喜好,在不违背基本要求的前提下,选择自己认可的编码方式。不要过于纠结用哪一种方式。比如方法的{}花括弧,我就喜欢每个单独一行。另外可以使用一些代码格式化的插件,实现老师文中提到的一些基本编码格式。

    作者回复: 是的,认为写好代码只有一种规范是不对的。所以,我们要理解规范要求背后的一些东西,这样就计较容易写出别人看的顺眼的代码。不过,如果一个项目有规范,还是要遵守的。审美偏好太难协调,每个人一套规范也很麻烦。

    插件是个好东西。有些规范,也是我们思考的逻辑的延展。要是编写代码的时候,就主动使用规范,也能帮助我们写好代码。

    
    
我们在线,来聊聊吧