加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在类上调用方法或作为参数传递给另一个类? C#

发布时间:2020-12-15 23:53:45 所属栏目:百科 来源:网络整理
导读:假设我正在使用’Job’类记录一些数据. (具有各种属性的业务对象列表,用于它的价值.) 我希望能够打印这些数据,所以我想知道是否有更优选的设计来做到这一点.我现在有两个想法 – 在Job本身上调用Print()方法,或者将Job实例传递给某种打印控制器类,例如: job
假设我正在使用’Job’类记录一些数据. (具有各种属性的业务对象列表,用于它的价值.)

我希望能够打印这些数据,所以我想知道是否有更优选的设计来做到这一点.我现在有两个想法 – 在Job本身上调用Print()方法,或者将Job实例传递给某种打印控制器类,例如:

job.Print();

要么

PrintWidget pw = new PrintWidget(job);
pw.Print();

目前,我无法设想打印此Job类中的数据以外的任何内容.但是,谁知道未来会怎样.考虑到这一点,在我想要打印的任何类上使用单独的Print()方法,或者可以处理不同类型的东西打印的一个Print控制器类会更好吗?

你会如何设计呢?提前感谢您的任何答案.

解决方法

您的问题完全符合单一责任原则(SRP),即 SOLID原则之一.

该原则基本上表明,精心设计的组件应该只负责单个任务.另一种看待它的方式是组件应该只有一个改变的理由.这可以确保当您需要更改某些内容时,您知道所有功能都将在一个位置,并且不会与其他功能混合使用.

在您的情况下,作业可能具有除打印之外的某种功能,或许在您的域模型中表示“作业”的一些职责.如果是,那么您不想在此处添加打印功能.而是创建您的打印小部件并将所有逻辑用于打印.

如果您的打印必须更改,您不必触摸您的Job对象,因为它的职责没有改变.同样,如果“作业”的概念发生变化,则仅修改作业类,并且打印保持不受影响(除非您现在有额外的东西要打印).

然而…

如果Job类的唯一目的是表示一些打印信息,那么它绝对应该包含PrintTo(打印机)方法,其中Printer将负责与物理打印机通信.在这种情况下,责任已转移到仅涉及打印的作业,并且它应该控制它的打印方式.

在您的设计中,SRP可能是一种难以看到的模式,但有一种简单的方法可以确定:

If you can sum up the functionality of
your class without using the word
“and”,the class has a single
responsiblity.

因此,Job负责“代表工作”或“打印工作信息”,但不是两者都有.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读