对象之间的交互

  之前写过一篇随笔《剪刀剪纸》是给一些新同事讲面向对象时用的,当时就感觉有些不顺畅,不过用来给新同事入门足够了就没多想,最近看书时偶尔走神把这件事想起来了,顺便群里讨论时谈到聚合之间的方法调用,于是决定写一篇博客纠正一下那篇随笔里的问题。

  开头先声明一下,以下只是个例子,只是用来说明对象间交互的解耦,怎么样交互我觉得更好,但是如果是真的要写一个剪刀剪纸的程序,之前随笔的做法并不一定就是不好的,有些耦合只是在需要解的时候才应该去解。另外,以下做法只是理想的做法,但是现实的项目总会有各种各样的妥协,所以主要还是随机应变,没有最好的做法,只有最合适的做法,声明暂时结束。

  在剪刀剪纸的随笔里写了:剪刀只需要关心自己发出了剪的动作,不需要关心纸,于是给纸抽象了一个东西的基类。但是回头细看其实这并没有解决问题,剪刀虽然没有和纸发生耦合,但是和东西发生了耦合,剪刀本身并不一定要剪东西,说不定就是个工艺品呢,剪刀剪纸随笔中剪子的Cut(Thing thing)方法参数选择了Thing等于将剪刀内部的逻辑对Thing公开了一部分,这种做法已经破坏了剪子的封装,同时也表达了一种业务逻辑,既剪刀剪东西,而且Thing也已经不是单纯的东西的概念,而是被剪子剪的东西。如果是一个初学者做项目,这么做问题或许不大,但是深究这种做法从某种角度来说是错的。

  上面一段说出的问题概括一下:

  1.剪刀和Thing(以下所说的Thing都代表”被剪的东西“这个概念)的耦合是多余的,如何让剪刀和Thing各自独立;

  2.在需要的时候,剪子和Thing可以交互完成剪东西这一业务。

  上面说了Cut的参数使用Thing破坏了封装,如果做好封装的话就可以解决上面的第一个问题。做好封装也就是说剪刀只包含自己的职责,也就是抽象好自己的职责,封装和抽象是相辅相成的存在。仔细思考下,剪子的职责应该是什么的,可以用来剪东西只是说明了它可以做什么,诺基亚还可以用来砸核桃(其实还有用来开核桃的模特模型,你懂得。。。),但你能说砸核桃是诺基亚的职责么,那剪刀的职责是什么,很明显没Thing那就一定是剪了,怎么表达这个剪呢,那就是发出一个剪的作用力,所以,我们可以增加一个作用力的对象,当然如果非要较真,作用力和剪刀还是有耦合,不过剪刀本就是接受并传递作用力的,作用力只是参数,而且作用力在这个业务场景中也是在一个工作单元里传递业务状态变化的根本,整个业务其实就是由作用力驱动的,其实这个作用力用命令模式的命令来表达或许更贴切,不过这里就不细说了。

 

    //关于命名,我是故意的,原因不想说,你们千万别学,作用力的意思public class KineticEnergy{public int Size { get; set; }public struct Point{public int X { get; set; }public int Y { get; set; }}}

   然后是剪刀的:

    public class Scissors{private KineticEnergy _kineticEnergyBeUsed { get; set; }public void Stress(KineticEnergy kineticEnergy){_kineticEnergyBeUsed = kineticEnergy;}public KineticEnergy SendCutEnergy(){return SwitchKineticEnergy();}private KineticEnergy SwitchKineticEnergy(){KineticEnergy kineticEnergyBeCut = _kineticEnergyBeUsed;//作用点和力的大小等变化return kineticEnergyBeCut;}}

  至于Thing还是看剪纸那篇随笔的,基本就是那意思,代码就不改个名重贴一遍这么费事了。

  下面就是第二个问题了,想必大家也看出来了,第二个问题基本上也不是问题了,剪刀剪一次纸的过程我们可以用一个工作单元来表示(我偷懒,传递的力一直在改变,但是反正重点不在这,就不要在意这些细节了):

    //工作单元UOW三个单词不是这么写的,看到的注意,别学!!!public class CutThingsWorkUnit{private KineticEnergy _kineticEnergy;private Scissors _scissors;private Thing _thing;//剪刀和Thing应该由业务场景的Context来提供public CutThingsWorkUnit(Scissors scissors, Thing thing){_scissors = scissors;_thing = thing;}public void Execute(){//这里的人,那篇随笔我已经给抽象掉了,放这里就是个意思,随便实例化一下,这种细节就不要在意了Person person = new Person();_kineticEnergy = person.UseScissorsKineticEnergy();_scissors.Stress(_kineticEnergy);_kineticEnergy = _scissors.SendCutEnergy();_thing.Stress(_kineticEnergy);}}

  最后,至于这东西被剪的结果,剪纸那篇随笔说过,就不再说了。

 

  

 

 

 

 

转载于:https://www.cnblogs.com/saaav/p/3763735.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NewCode----数串

题目描述: 设有n个正整数,将他们连接成一排,组成一个最大的多位整数。 如:n3时,3个整数13,312,343,连成的最大整数为34331213。 如:n4时,4个整数7,13,4,246连接成的最大整数为7424613。 输入描述: 有多组测试样例&#xff0c…

计算机跨专业专插本学音乐,欢迎投稿丨专插本可以跨专业考,只要肯坚持!

点击上方△蓝字可关注我们昵称E师姐性别女插本复习资料教材、小红书、CB398、启航等插本关注的公众号、网站等介绍微信公众号居多:专插本资料库、专插本直通车、广东省专插本、插本最前线等等……专科学校和专业广州城市职业学院 会计插本学校和专业广东财经大学华商…

Android,监控ContentProvider的数据改变

有时候应用中需要监听ContentProvider的改变并提供响应,这时候就要利用ContentObserver类了 不管是ContentProvider中实现的,insert,delete,update方法中的任何一个,程序都会调用getContext().getContentResolver().notifyChange(uri,null); 这行代码可用…

[leetcode]Sort List

题目要求:Sort a linked list in O(n log n) time using constant space complexity. 数据结构定义: 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : v…

北京市中 高英语听说计算机考,2021年北京高考首次英语听说机考时间确定,共五种题型...

从明年开始,北京市高考统考英语科目增加口语考试,连同之前的听力考试一起,实行一年两考。今天,北京教育考试院发布消息,2021年高考英语听说计算机考试首考将于2020年12月12日进行。12月7日起,考生可登陆北京…

NewCode----彩色宝石项链

题目描述: 有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是…

插件开发-UI插件开发

1.新建类库解决方案,引入命名空间,同时引入要添加UI Form的WebPart(在Portal\UILib目录下)2.继续UFSoft.UBF.UI.Custom.ExtendedPartBase,重写AfterInit()方法,代码如下,便于添加下拉列表按钮,在原单据中UI先新增一下拉…

为博客园选择一个小巧霸气的语法高亮插件

博客园的语法高亮简直蛋疼,于是乎就打算找一个靠谱的插件来改造下。各种百度谷歌,大致得到几个推荐:SyntaxHighlighter,Snippet,Google Code Pretiffy,Highlight,SHJS。其实 SyntaxHighlighter …

计算器软件设计和计算机软件设计区别,求一个模拟计算器程序

# include# include# include# include# define MAX_OPERATOR_NUM 100//运算符栈数组长度# define MAX_DATA_NUM 100//运算数栈数组长度typedef struct OPStack//定义运算符栈{char opStack[MAX_OPERATOR_NUM];int top;}OPStack, *pOPStack;typedef struct DATAStack//定义操作…

python中print语句

学习链接1 学习链接2 1. 如果print语句后面什么符号都没有是个换行语句,也就是是要另起一行。 2. 分号表示下次输出是紧挨着这个光标位置输出. 3. 而逗号是下次输出与这次输出有一定的空格之后接着输出. namekk salutationMr. greetingHello, print greeting,sa…

计算机应用基础论坛贴子怎么发,网络课程论坛中长尾现象的应对策略——以《计算机应用基础》网络课程为例...

摘要:进入21世纪以来,互联网就备受关注.由于我国信息设施资源建设稳步推进,互联网的基础更为坚实,发展更为迅速.据权威数据统计,中国至2009年约拥有130万个BBS论坛,数量为全球第一,然而,作为分享和参与类应用的典型代表(更新博客,发帖/回帖)的使用率仍然偏低.笔者在…

解析Json需要设置Mime

IIS6.0 1.打开IIS添加Mime项 关联扩展名:*.json内容类型(MIME):application/x-javascript 2.添加映射: 位置在IIS对应站点右键属性:”主目录”-”应用程序设置”-”配置”-”映射”-”添加”,会打开”添加/编辑应用程序…

Using the Transient Fault Handling Application Block

http://msdn.microsoft.com/en-us/library/dn440719(vpandp.60).aspx转载于:https://www.cnblogs.com/fengye87626/p/3772555.html

让python脚本像普通程序一样运行

有些时候像运行其他程序一样运行python程序(也叫做脚本),而不是显式使用python解释器。在UNIX中有个标准的实现方法:在脚本首行前面加上#!(叫做pound bang或者shebang),在其后加上用…

Function类型(JS高程3)—— JS学习笔记2015-6-29(第70天)

Function 类型 函数是对象 具有属性和方法,函数名实际上是一个指向函数对象的指针 没有重载; 函数声明和函数表达式 函数声明: function sum (num1, num2){ return num1 num2; } 函数表达式: var sum function(num1, num2){ ret…

PS图片删除需要计算机管理权限,如何使用PsTools工具执行本地/远程PC管理任务

大多数刚入门的管理员都习惯使用 RDP 或其它类似的工具连接到远程 Windows 中进行图形化管理。而 PowerShell 及 PsTools 等工具可以帮助我们在命令行中执行相当多的管理任务,更主要的是可以将其写成脚本来执行周期性重复任务或在管理大批量服务器时提高效率。在企业…

LeetCode:Spiral Matrix I II

Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 打印螺旋矩阵 逐个环…

TCP为什么需要三次握手和四次挥手

网上已经有很多解释了,就不瞎说了,Mark一些链接作为自己的学习笔记吧。 学习参考链接1 学习参考链接2 学习参考链接3 学习参考链接4 为什么要3次握手 防止已过期的连接请求报文突然又传送到服务器,因而产生错误。 Client发生一个请求连…

不属于个人计算机范围的是,计算机应用基础模拟试卷2

一、1.单项选择题单项选择题每小题1分。在每小题列出的四个备选项中只有一个是符合题目要求的,请将其选出并将“答题卡”的相应代码涂黑。未涂、错涂或多涂均无分。0. 个人计算机属于A.小巨型机B.小型计算机C.微型计算机D&#xf…

Python实验:关灯游戏

文章目录 前言一、设计表二、关键代码三、运行结果小地图,容易难度:中地图,中等难度:大地图,困难难度: 四、完整代码链接总结 前言 这是一个Python实验作业,内容如下: 题目要求&am…