From Apprentice To Artisan 翻译 19

为什么80%的码农都做不了架构师?>>>   hot3.png

上一篇

Interface Segregation Principle 接口隔离原则

Introduction 介绍

The Interface Segregation principle states that no implementation of an interface should be forced to depend on methods it does not use. Have you ever had to implement methods of an interface that you did not need? If so, you probably created blank methods in your implementation. This is an example of being forced to use an interface that breaks the Interface Segregation principle.

接口隔离原则规定在实现接口的时候,不能强迫去实现没有用处的方法。你是否曾被迫去实现一些接口里你用不到的方法?如果答案是肯定的,那你可能创建了一个空方法放在那里。被迫去实现用不到的函数,这就是一个违背了接口隔离原则的例子。

In practical terms, this principle demands that interfaces be granular and focused. Sound familiar? Remember, all five SOLID principles are related, such that by breaking one you often must break the others. When breaking the Interface Segregation principle, the Single Responsibility principle must also broken.

在实际操作中,该原则要求接口必须粒度很细,且专注于一个领域。听起来很耳熟?记住,所有五个“坚实”原则都是相关的,也就是说当打破一个原则时,你通常肯定打破了其他的原则。在这里当你违背了接口隔离原则后,肯定也违背了单一职责原则。

Instead of having a "fat" interface containing methods not needed by all implementations, it is preferable to have several smaller interfaces that may be implemented individually as needed. By breaking fat interfaces into smaller, more focused contracts, consuming code can depend on the smaller interface, without creating dependencies on parts of the application it does not use.

“臃肿”的接口,有着很多不是所有的实现类都需要的方法。与其写这样的接口,不如将其拆分成多个小巧的接口,里面的方法都是各自领域所需要的。这样将臃肿接口拆成小巧、功能集中的接口后,我们就可以使用小接口来编码,而不必为我们不需要的功能买单。

Interface Segregation Principle 接口隔离原则

This principle states that no implementation of an interface should be forced to depend on methods it does not use.

该原则规定,一个接口的一个实现类,不应该去实现那些自己用不到的方法。如果需要,那就是接口设计有问题,违背了接口隔离原则。

In Action 实践

To illustrate this principle, let's consider an example session handing library. In fact, we will consider PHP's own SessionHandlerInterface. Here are the methods defined by this interface, which is included with PHP beginning in version 5.4:

为了说明该原则,我们来思考一个关于会话处理的类库。实际上我们将要考察 PHP 自己的SessionHandlerInterface。下面是该接口定义的方法,他们是从 PHP 5.4 版才开始有的:

<!-- lang:php -->
interface SessionHandlerInterface {public function close();public function destroy($sessionId);public function gc($maxLifetime);public function open($savePath, $name);public function read($sesssionId);public function write($sessionId, $sessionData);
}

Now that you are familiar with the methods defined by this interface, consider an implementation using Memcached. Would a Memcached implementation of this interface define functionality for each of these methods? Not only do we not need to implement all of these methods, we don't need half of them!

现在我们知道接口里面都是什么方法了,我们打算用Memcached来实现它。Memcached需要实现这个接口里的所有方法么?不,里面一半的方法对于Memcached来说都是不需要实现的!

Since Memcached will automatically expire the values it contains, we do not need to implement the gc method of the interface, nor do we need to implement the open or close methods of the interface. So, we are forced to define "stubs" for these methods in our implementation that are just empty methods. To correct this problem, let's start by defining a smaller, more focused interface for session garbage collection:

因为Memcached会自动清除存储的过期数据,我们不需要实现gc方法。我们也不需要实现openclose方法。所以我们被迫去写空方法来站着位子。为了解决在这个问题,我们来定义一个小巧的专门用来垃圾回收的接口:

<!-- lang:php -->
interface GarbageCollectorInterface {public function gc($maxLifetime);
}

Now that we have a smaller interface, any consuming code can depend on this focused contract, which defines a very narrow set of functionality and does not create a dependency on the entire session handler.

现在我们有了一个小巧的接口,功能单一而专注。需要垃圾清理的只用依赖这个接口即可,而不必去依赖整个会话处理。

To further understand the principle, let's reinforce our knowledge with another example. Imagine we have a Contact Eloquent class that is defined like so:

为了更深入理解该原则,我们用另一个例子来强化理解。想象我们有一个名为Contact的Eloquent类,定义成这样:

<!-- lang:php -->
class Contact extends Eloquent {public function getNameAttribute(){return $this->attributes['name'];}public function getEmailAttribute(){return $this->attributes['email'];}
}

Now, let's assume that our application also employs a PasswordReminder class that is responsible for sending password reminder e-mails to users of the application. Below is a possible definition of the PasswordReminder class:

现在我们再假设我们应用里还有一个叫PasswordReminder的类来负责给用户发送密码找回邮件。下面是PasswordReminder的定义方式的一种:

<!-- lang:php -->
class PasswordReminder {public function remind(Contact $contact, $view){// Send password reminder e-mail...}
}

As you probably noticed, our PassswordReminder is dependent upon the Contact class, which in turns means it is dependent on the Eloquent ORM. It is neither desirable or necessary to couple the password reminder system to a specific ORM implementation. By breaking the dependency, we can freely change our back-end storage mechanism or ORM without affecting the password reminder component of the application. Again, by breaking one of the SOLID principles, we have given a consuming class too much knowledge about the rest of the application.

你可能注意到了,PasswordReminder依赖着Contact类,也就是依赖着Eloquent ORM。 对于一个密码找回系统来说,依赖着一个特定的ORM实在是没必要,也是不可取的。切断对该ORM的依赖,我们就可以自由的改变我们后台存储机制或者说ORM,同时不会影响到我们的密码找回组件。重申一遍,违背了“坚实”原则的任何一条,就意味着有个类它知道的太多了。

To break the dependency, let's create a RemindableInterface. In fact, such an interface is included with Laravel, and is implemented by the User model by default:

要切断这种依赖,我们来创建一个RemindableInterface接口。事实上Laravel已经有了这个接口,并且默认由User模型实现了该接口:

<!-- lang:php -->
interface RemindableInterface {public function getReminderEmail();
}

Once the interface has been created, we can implement it on our model:

一旦接口定义好了,我们就可以在模型上实现它:

<!-- lang:php -->
class Contact extends Eloquent implements RemindableInterface {public function getReminderEmail(){return $this->email;}
}

Finally, we can depend on this smaller, more focused interface in the PasswordReminder:

最终我们可以在PasswordReminder里面依赖这样一个小巧且专注的接口了:

<!-- lang:php -->
class PasswordReminder {public function remind(RemindableInterface $remindable, $view){// Send password reminder e-mail...}
}

By making this simple change, we have removed unnecessary dependencies from the password reminder component and made it flexible enough to use any class from any ORM, so long as that class implements the new RemindableInterface. This is exactly how the Laravel password reminder component remains database and ORM agnostic!

通过这小小的改动,我们已经移除了密码找回组件里不必要的依赖,并且使它足够灵活能使用任何实现了RemindableInterface的类或ORM。这其实正是Laravel的密码找回组件如何保持与数据库ORM无关的秘诀!

Knowledge Is Power 知识就是力量

Again we have discovered the pitfalls of giving a class too much knowledge about application implementation details. By paying careful attention to how much knowledge we are giving a class, we can abide by all of the SOLID principles.

我们再次发现了一个使类知道太多东西的陷阱。通过小心留意是否让一个类知道了太多,我们就可以遵守所有的“坚实”原则。

下一篇

转载于:https://my.oschina.net/zgldh/blog/389125

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

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

相关文章

Winform模拟post请求和get请求登录网站

引言最近有朋友问如何用winform模拟post请求&#xff0c;然后登录网站&#xff0c;稍微想了一下&#xff0c;大致就是对http报文的相关信息的封装&#xff0c;然后请求网站登录地址的样子。发现自己的博客中对这部分只是也没总结&#xff0c;就借着这股风&#xff0c;总结一下h…

那些上海滩的金融传奇,或许都开始于一份PPT

全世界只有3.14 % 的人关注了爆炸吧知识 我从07年开始在上海做商务PPT定制&#xff0c;从工作室一步一步到国内首家PPT定制公司&#xff0c;从电脑前到讲台前做培训&#xff0c;算是见证了中国PPT行业的发展。在我大大小小做过的项目里&#xff0c;印象最深的莫过于“靠PPT拿下…

Android 控件之RatingBar评分条

RatingBar是Adnroid中的评分条。效果挺得的 源码下载 一、概述 RatingBar是SeekBar和ProgressBar的扩展&#xff0c;用星星来评级。使用的默认大小RatingBar时&#xff0c;用户可以触摸/拖动或使用键来设置评分&#xff0c;它有俩种样式&#xff08;大、小&#xff09;&#xf…

3d目标检测_CVPR 2020 |基用于3D目标检测的层级图网络

论文&#xff1a;A Hierarchical Graph Network for 3D Object Detection on Point Clouds论文地址&#xff1a;https://www.aminer.cn/pub/5eccb534e06a4c1b26a834c7?confcvpr2020由于大多数现有的点云对象检测方法不能充分适应点云的特征(例如稀疏性)&#xff0c;所以一些关…

position定位 响应式_使用 Vue3 实现双盒子定位 Overlay

之前说过&#xff0c;使用 可以很优雅的把某个组件渲染到根节点之外的节点&#xff0c;同时使其渲染的内容不丧失响应式和对应的生命周期函数调用。那么基于此&#xff0c;用 实现相对于某一元素的 Overlay 。实际上&#xff0c;这篇文章跟 Vue3 的关系不大&#xff0c;只是通…

月薪5 千~1万的兼职你要不要?不限学历,不限男女!

全世界只有3.14 % 的人关注了爆炸吧知识你想拥有一份月薪过万的兼职吗&#xff1f;窝在家里就行的那种&#xff1f;这就有一份看起来高大上、实则难度系数并不高的英语翻译&#xff01;兼职英语翻译到底有多赚钱&#xff1f;水平一般的英语笔译员一周7天每天拿出2小时翻译&…

【分享】154页微软WPF官方手册(含.NETCore和.NET Framwork双版本)

物联网IOT多场景概念落地&#xff0c;带火了WPF招聘&#xff0c;像阿里影视、百度地图、小米小鹏特斯拉都在高薪抢WPF人才了。机智的.NET开发者去关注学习WPF的时候却发现&#xff0c;市面上真的太缺WPF优秀的教程了&#xff0c;还好这里有最权威最详尽的微软官方pdf教程&#…

ln -s 的一个坑

为什么80%的码农都做不了架构师&#xff1f;>>> 事情是这样的&#xff0c;今天在ssh到iphone上将一个应用内目录软链接配置到用户目录下时&#xff0c;执行了如下命令&#xff1a; cd /var/mobile/Applications/9E13D9B8-63E0-49A5-82CE-6DB914495EC1/Documentsmkd…

知乎高赞:这个开挂神器简直了!

全世界只有3.14 % 的人关注了爆炸吧知识对于工作学习中常要用到PPT的人来说&#xff0c;每当谈起PPT&#xff0c;是否都会出现以下印象&#xff1a;[买模板]→[改PPT]→[粘贴复制]→[应付领导][操作繁琐]→[体力劳动]→[熬夜]→[加班]从什么时候开始&#xff0c;PPT从一个 表达…

性能再提升70%?大咖前瞻带你揭开.NET6的神秘面纱!

本月初微软官宣 .NET6 的RC1即将在11月正式发布&#xff0c;这意味着 .NET6 正式版跟我们见面的时间又近了一步。在之前的 .NET6 预览版本中&#xff0c;微软加入了大量新功能特性&#xff0c;而在最终版本中将不再额外加入新的内容&#xff0c;只对现在的内容进行进一步性能优…

JMS : Java Message Service (Java消息服务)之一 [转]

为什么80%的码农都做不了架构师&#xff1f;>>> 1 引言1.1 编写目的本文作为B2bi项目中开源产品JORAM的使用指导文档&#xff0c;旨在帮助项目组人员方便明了的进行JMS模块的详细设计和开发工作。本文档主要包含建设银行EAI平台B2Bi子系统中使用的开源JMS产品??J…

在床上玩手机,千万不能把手机放下!

1 当你在床上玩手机时▼2 据说兔子都是大长腿▼3 真是凭实力单的身▼后续▼4 这不是怕你不信嘛▼5 不看监控真不知道他咋上去的▼6 听说&#xff0c;他们已经没有暑假了▼7 感觉有被冒犯到▼你点的每个赞&#xff0c;我都认真当成了喜欢

python浪漫代码_五行Python代码实现批量抠图

你是否曾经想将某张照片中的人物抠出来&#xff0c;然后拼接到其他图片上去&#xff0c;从而可以即使你在天涯海角&#xff0c;我也可以到此一游&#xff1f;专业点的人使用 PhotoShop 的“魔棒”工具可以抠图&#xff0c;非专业人士可以使用各种美图 APP 来实现&#xff0c;但…

日常使用Git,这些问题你遇到过吗?

GitHub 作为世界上最大的代码托管平台&#xff0c;几乎所有的开发者都有个 GitHub 的账号。因为无论对于开发者还是普通用户来讲&#xff0c;GitHub 上面都有不少优质开源项目可以借鉴和学习。其受欢迎程度还体现在&#xff0c;越来越多的人会主动优化自己的 GitHub 主页&#…

Android API 中文(14) —— ViewStub

前言关键字&#xff1a; android.view.ViewStub&#xff0c;版本为Android 2.2 r1本章翻译来自唐明 &#xff0c;这里本博负责整理和发布&#xff0c;欢迎其他译者一起参与Android API 的中文翻译行动&#xff0c;联系我over140gmail.com。 声明 欢迎转载&#xff0c;但请保留文…

stm32l0的停止模式怎么唤醒_「正点原子STM32Mini板资料连载」第十九章 待机唤醒实验...

1)实验平台&#xff1a;正点原子STM32mini开发板2)摘自《正点原子STM32 不完全手册(HAL 库版)》关注官方微信号公众号&#xff0c;获取更多资料&#xff1a;正点原子第十九章 待机唤醒实验本章我们将向大家介绍 STM32 的待机唤醒功能。在本章中&#xff0c;我们将使用 WK_UP 按…

Pgbouncer 介绍

Pgbouncer 介绍 PostgreSQL 的轻量的连接池。 特性 在轮转连接的时候有好几种方式&#xff1a;Session pooling/会话连接池最礼貌的方法。在客户端连接的时候&#xff0c;在它的连接生命期内&#xff0c;会给它赋予一个服务器连接。在客户端断开的时候&#xff0c;服务器连接会…

阿里全球数学竞赛落幕:全球最强73人出炉,北大获奖人数第一,还“炸出”各路世界大牛...

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;量子位 ID&#xff1a;QbitAI作者&#xff1a;边策 金磊又是一场学霸的盛宴。阿里达摩院举办的第二届数学竞赛今天顺利结束&#xff0c;这场号召全民参与的数学竞赛&#xff0c;初赛的题目画风是这样的&#xff1a;是不…

【Azure + Core】实现CI/CD(一)构建镜像并推送仓库

&#xff08;海上生明月&#xff0c;天涯共此时&#xff09;今天是农历八月十六&#xff0c;大家中秋节快乐&#xff01;放了三天假&#xff0c;和家人整理下屋子&#xff0c;打扫下卫生&#xff0c;闲着无聊就研究点儿新东西。最近一直再看DevOps相关的内容&#xff0c;自从开…

detectron2训练自己的数据集_keras版MaskRCNN来训练自己的目标检测数据集

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447;机器学习AI算法工程 公众号&#xff1a;datayx一、运行环境的安装&#xff1a;1、下载好cuda9跟cudnn7&#xff0c;然后在安装好后&#xff0c;cuda其会自动添加到环境变量里&#xff0c;所以使用kera…