作者yauhh (哟)
看板Programming
标题Re: [讨论] 什麽情况下该把task包成function
时间Thu Feb 16 23:18:34 2012
※ 引述《BM0108 (冲)》之铭言:
: 在「同一份file」中(不同file间要import,那当然要把task包成function,毫无疑问)
: 假如某个task过於庞大或是要被重复使用,那都可以包成一个function以利维护及使用
: 这是我的认知
: 最近听到一个说法是
: 为了日後maintain方便,
: 即便只有3,4行code且只会用到一次的小task也应该被写成一个function
: 乍听之下颇有道理
: 可是我自己的经验是
: 过份的把task包成function
: 整分file的行数会激增还是小事,
: 日後要maintain时,会需要一直回头查某个function的实做方式
: 就算注解或doc写得很好,查注解或doc毕竟不如直接看code来得直接
: 更何况,绝大多数的情况下,注解都写得很简陋、通常不会有doc这种东西 Orz
: 想和版上前辈请益一下,究竟是我没掌握到精髓
: 还是过小、使用频率不高的task,确实不需要包成function?
"即使只有3,4行code且只会用到一次的小task也应该被写成一个function"
这句话,我们可以检查这句话套用到多少种情况中.
有人说,所谓模组化程式设计,就是每隔100行程式划一条红线.
事实上是这样子吗? 就算这样划一划,也不会帮助你好好整理程式.
有人说低藕合,高内聚,ok,这一点很重要.
有人说物件导向... 分一分各种函数到各种模组及类别中之後,
我们经常可以回头仔细一想,然後说其实自己并没有使用物件导向思考.
(物件导向并不是先写一个物件,然後後面加一个点带出它的方法或属性,就算数.
或许你写一堆OOP的程式,但工夫做得最好的是把函数整理得很好.)
那麽,最起码,好好地整理一些函数呢? 什麽叫作函数,是把共用的程式码收在一起
就称为函数吗?
个人觉得,从英文字面来思考,所谓函数 function, 另一个意思就是功能.
一个函数是充份发挥一个功能的单元,特别是你关心这个函数呼叫之後拿到的传回值.
可是我们又知道,程式缠在一起的时候,很多函数都会称为副程式,而且是
在基本的输入和输出值之外,还被一大堆前置状态缠住.
我个人觉得,起码你可以把函数和副程式二样东西区分清楚.
如果你要写一个函数,那就以输入值和输出值为重.
如果你要写副程式,也就是将几行共用的程式码收在一个地方,那麽状态的一致性
就是低藕合的重点. 你最好将每一个副程式的进入状态分析清楚,比较好掌握.
我觉得划分各种程式区块,无论是函数,副程式或任何长段程式的子段落,
你都要给这个程式区块定义一项明确的定义.
这定义就好像是命名一样,抓紧意义很重要.
然後要在自己脑中或程式注解中描述这些定义描述清楚; 或者在程式写法或
程式字面上把故事讲得很清楚,或者把故事的结构性描述得清楚.
这会变成像是把程式当作文件来写,应该可以说是 coding 的艺术.
讲到艺术,当你修改一副画的时候,不会因为一时着急就把修补的区块乱画;
同理,如果你有心把程式整理得很好,在改每个程式单元时,都应该会回想到
当初所赋与这段程式的意义,以及这段程式的输入,输出,以及周边状态的一致性,
然後非常小心动笔.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.112.224.132
※ 编辑: yauhh 来自: 59.112.224.132 (02/16 23:20)
1F:推 hero234pq:好文章 推~ Thanks 124.127.119.34 02/17 18:35
2F:推 meltice:我一行都不想动 牵一发而动全身啊 115.83.52.180 02/19 09:44
3F:→ meltice:就算前人的code我也只敢用#if 0 115.83.52.180 02/19 09:44
4F:→ meltice:然後整个code就是乱七八糟的 115.83.52.180 02/19 09:45
5F:→ adrianshum:#if 0 和动了有什麽分别... orz 223.19.40.221 02/20 11:52
6F:→ adrianshum:有用任何 SCM 就能找回旧 code 了, 223.19.40.221 02/20 11:53
7F:→ adrianshum:#if 0 根本於事无补.. 223.19.40.221 02/20 11:53