作者H45 (!H45)
看板OOAD
标题[Guideline] DON'T OVERCLASSIFY
时间Sat Nov 17 18:26:06 2007
_________________________
DON'T OVERCLASSIFY
Separate concepts into different classes based on
behavior, not on data.
﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉
※ 节录自:Prefactoring - P.62
曾经有朋友去面试一家公司,面试员问了他一个问题:
「你怎麽决定哪些类别要做,哪些类别不需要做?」
朋友似乎是问答他:
「我都是全部包成类别!」
Oops, 这样的回答恐怕会让面试员不太满意.......
因为不是所有的概念都要做成「不同的」类别
反倒是类似的概念可以藉由拥有不同属性的相同类别来描述
所以类似的概念可以用单一类别来做
不只是如此,有些简单的概念「不适合」做成一个类别
因为不是所有的概念都适合以类别来表示
反倒是基本型态就足够让设计者了解整个系统的运作模式
所以有些简单的概念可以用基本型态来处理
举例而言:
我手上有 500 张风景图,300 张人物图,700 张植物图
一般人的直观会把这些图案分类为「风景图」、「人物图」、「植物图」
然後把这三种图案分别做成三个「不同的类别」
之後再做一个新类别叫作「图片」当成这三种图案的父类别
但是!把三种图案分成三个「不同的类别」有什麽意义吗?
它们的「行为」几乎完全相同:取得像素值、设定像素值、……
那麽把它们分成三个类别不就只是徒增软体复杂度而已?
需求文件如果没有特别描述风景图、人物图、植物图要哪些不同的操作功能
只需要一个「图片」类别就够了。
刚刚有提到像素值这一回事儿
有些人会把像素值做成一个类别
因为八位元的像素值只会落在 [0, 255],甚至有些标准化的数值是在 [0, 1] 区间
而且进行影像处理的时候,需要取得像素值的「红色」、「绿色」、「蓝色」
甚至有些情况还要取得它的「色调」、「饱合度」、「亮度」
这麽多的理由支持像素值应该独立出去,建立自己的类别大国
但是!像素值是一个非常底层的概念,而且也非常地简单
它就是一个数字,一个数字而已
有需要为了它建立这麽多的成员方法吗?
仔细想一想,进行影像处理的时候,每次都必须先取得像素值,它也许是一个整数
如果套用像素类别,那麽图片上的每一个像素值都会是一个物件
这意味着 256×256 的图片就会有 256×256 个像素物件
Oops, 比起全部都用整数来储存,这麽多的像素物件会是一个很恐怖的效能瓶颈
像素类别的小小改变,会牵动整个系统的执行效率
在这个角度来看的话,不仅每次从影像取得像素值都多了一步建构物件的麻烦
而且还严重地影响了系统的执行效率
这麽底层又简单的像素概念,恐怕不太适合做成一个类别。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.247.13
※ 编辑: H45 来自: 140.116.247.13 (11/17 21:39)