作者s4300026 (s4300026)
看板C_Sharp
标题[问题] 模式设计
时间Sat Dec 14 11:12:56 2019
大家好
小弟想询问 "在不同情境下,要做部分不同的事情时,要怎麽分类会比较好"
这个问题问起来还蛮抽象的
所以用下列情境来描述:
----------
前情提要:
小弟最近在做 特徵比对 的 人机介面设计(GUI)
特徵比对 最简单的讲法就是 在一张白纸上,用黑笔写上一个数字
然後找数字的轮廓,和轮廓的位置平均值 (重心),和比对相似度
轮廓 就是 List<PointF>
重心 就是 PointF
相似度 就是 Double
-----------
情境:
有三个UI画面要呈现
分别是 移动平台校正、学习特徵、实物比对
在三个画面中,都会有共同的行为,就是接收 特徵比对的EventCallback
UI画面要根据特徵比对的结果做以下行为:
1. 校正画面:
用红色圆圈绘出轮廓,然後不标示重心位置
2. 学习画面:
用黄色圆圈绘出轮廓,要用黄色十字线标示重心位置
3. 实物画面:
如果够相似,用绿色圆圈绘出轮廓,用绿色十字线标示重心位置。
如果不够相似,就用红色圆圈绘出轮廓,用红色十字线标示重心位置。
因此我在三个页面下的 callback function独立写了三段相似却无法合并的程式码
接着某一天,我的BOSS跟我说,为什麽要用圆圈绘轮廓,用点不是很好吗?
然後我就要在三个独立页面分别改这三段程式码
然後我就漏改了一个页面
变成有些页面用 圆形绘图,有些用点绘轮廓
然後第二次DEMO时就很尴尬,因为我说 "我改完了"
但是在测试时,就被抓包有些地方没改到
我觉得实在是 OOXX
这时,我朋友跟我说
那就把这三段程式码提出来,用if else 判断阿
这样下次改时
就可以一起改了,多好?
即:
//绘十字中心时
if(校正)
else if(学习)
else if(比对)
//绘轮廓时
if(校正)
else if(学习)
else if(比对)
但我觉得这实在是并不起来
我的理由是这是三种页面的不同行为
现在打散在各个页面是很恰当的
如果集中管理
确实可以减少漏改的问题
但 ... 整个就是 觉得怪怪的
因为我最近在学模式设计时,就是希望把东西拆开来
但这想法根本就是把东西应试凑在一起阿...
所以想询问板上有没有大大能提供好建议呢?
举例来说:
哪天被要求:
十字中心线,要缩小,或是十字中心线,重心的地方不要有线
或是 比对模式,要多绘出相同重心下,标准轮廓的样貌
或是 在轮廓右下角,要添加上比对分数
等等之类的
改时要保持风格要一致的问题...
----------------
结论:
1. 三个页面分开写,改code时要改三个地方,会漏改
2. 三个页面的callback合并,改code时,一次改全部,但多增if else
想询问如果是你,你会怎麽做?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 221.169.231.173 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1576293178.A.51B.html
1F:→ testPtt: 三个页面分开写 但处理资料code要共用 12/14 14:19
2F:→ annies5: 不太懂你说的页面是指?我做的话会放同一个class 12/14 15:20
3F:→ s4300026: 是三个页面,三个页面的风格要一致,就像三个页面的字 12/14 15:44
4F:→ s4300026: 体大小要一样,字型要一样,但显示的文字要不一样 12/14 15:44
5F:→ s4300026: 我在内文的举例是,三个页面会接收相同的event,但有些 12/14 15:48
6F:→ s4300026: 呈现的某些部分要一样,某些不一样,在这样情况下,值 12/14 15:48
7F:→ s4300026: 不值得将这地方提取出来 12/14 15:48
8F:推 anumis: 我的想法是先模糊化需求,把3个功能的进入点先统一成固定 12/14 18:12
9F:→ anumis: 名称 (e.g. execute ()),然後才好定 interface 12/14 18:12
10F:→ anumis: UI那边就跑 interface ,用工厂模式产生实体 12/14 18:12
11F:→ anumis: 以上都没问题,再来做同质性参数分析,回头修改你的interf 12/14 18:12
12F:→ anumis: ace/实作 12/14 18:12
13F:→ testPtt: 做个类别一样的写一次就好 再用委派呼叫不一样的东西 12/14 20:16
14F:→ s4300026: 进入的方法是一样的,都是PatternMatchDoneCallBack(sen 12/15 11:08
15F:→ s4300026: der, e),也就是说,你们也是建议将散落在各ui control 12/15 11:08
16F:→ s4300026: 的方法集中管理就是了。只是我的朋友建议的是if else的 12/15 11:08
17F:→ s4300026: 方式,而你们建议可以考虑用class的方式管理。 12/15 11:08
18F:→ annies5: 页面风格统一请用CSS, sender指的是触发事件的元件(按钮) 12/15 17:53
19F:→ annies5: 情境的部分请用enum宣告 12/15 17:55
20F:→ s4300026: 我用的windows form application... 12/15 20:03
21F:→ testPtt: 你可以做user control做好基本UI 再设定委派就很好维护了 12/15 20:44