paint-brush
任何是认清? JavaScript 中的信息查询专业人士和创立者原理 路过@serhiirubets
11,509 讀數
11,509 讀數

什么是把握? JavaScript 中的信息专家和创造者原则

途经 Serhii Rubets1m2022/06/07
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

GRASP 缩写为 *General Responsibility Responsibility Assignment Software Patterns。这是一组非常好的建议、原则和模式,可以让我们的代码变得更好。今天,我们有许多最佳实践、原则(SOLID、DRY、GoF、KISS 等)和其他,它们都在努力帮助我们,编写好的、可维护的代码和可理解的代码。我们想要创建功能,它将计算我们订购商品的总和。我们将学习前两个原则:信息专家和创造者。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 什么是把握? JavaScript 中的信息专家和创造者原则
Serhii Rubets HackerNoon profile picture
今晚,你们有大多好的实际操作、底线(SOLID、DRY、KISS)、GoF 模式切换之类。他俩都是在尽力帮住我们大家以上开发技术人网站好的、无残留、可保障和可看待的码。


GRASP 是General Responsibility Assignment Software Patterns 的缩写。


真是一个相当好的推荐、的基本原则和状态,都可以我能的代码怎么用会变得更优质。我能看看该表单:


  • 信息专家
  • 创作者
  • 控制器
  • 低耦合
  • 高凝聚力
  • 纯制造
  • 间接的
  • 受保护的变体
  • 多态性


当今,各位将学习的前2个要求:信息小编和塑造者。

信息专家

信息内容中医专家几率是整个 GRASP 的模式切换中最沉要的。该的模式切换说整个处理数值(局部字符串、字符串名)的办法都肯定处在数值(局部字符串或字符串名)会有的一模一样的位置。


我确定,我确定,这听了起来不太清晰,这些我要们看有一位事件。咱们想开启有一位用途来统计咱们定购的货物的总数。


假设检验我国有 4 个文件名称:main.js、OrderList、OrderItem 和 Product。


护肤品应该涵盖 id、name 和 price(或是大多任何字段名,与我的实例息息相关):


 class Product { constructor(name, price) { this.name = name; this.price = price; } }


OrderItem 将都是个包函类产品和运算的容易客体,详细随时:


 class OrderItem { constructor(product, count) { this.product = product, this.count = count } }


OrderList 材料将一般包括加工处理 orderItems 数组的形式逻辑。


 class OrderList { constructor(items) { this.items = items; } }


所以,main.js 都是当时就能够 蕴含很多初始值思维的文件夹,就能够 添加 OrderList,并对这种索引做很多时间。


 import { OrderItem } from './OrderItem'; import { OrderList } from './OrderList'; import { Product } from './Product'; const samsung = new Product('Samsung', 200); const apple = new Product('Apple', 300); const lg = new Product('Lg', 150); const samsungOrder = new OrderItem(samsung, 2); const appleOrder = new OrderItem(samsung, 3); const lgOrder = new OrderItem(samsung, 4); const orderList = new OrderList([samsungOrder, appleOrder, lgOrder]);


都应该怎么去里开启计算出总计的方式 ?不少于有 2 个文档,每文档都要以用在此为的,对吗?所以那一个城市更适用咱们的的目标呢?


我不想们考量一下子 main.js。


我国还可以这么写:


 const totalSum = orderList.reduce((res, order) => { return res + order.product.price * order.count }, 0)


它会起用处的。虽然,orderItem 文档构成无做法的大统计资料,orderList 文档也构成无做法的大统计资料,主文档构成1个处理单好项目和单汇总的做法。


听起来不太好。如果我们想以某种方式添加更多与订单一起使用的逻辑,我们是否也将其放在主文件中?而且,一段时间后,我们的主文件会有很多不同的逻辑,有数千行代码,这真的很糟糕。这种反模式称为God object ,其中 1 个文件包含所有内容。


如果我们想使用信息专家的方法应该怎么做?让我们尝试重复:


任何进行处理大数据库(全局全局变量、大数据类型)的手段都肯定在大数据库(全局全局变量或大数据类型)具备的敌方。


这含意着: orderItem 会分为能够 计算公式某些的项目总计的思维模式:


 class OrderItem { constructor(product, count) { this.product = product, this.count = count } getTotalPrice() { return this.product.price * this.count; } }


因此 orderList 该涵盖可不可以来计算全部签单建设项目总计的结构:


 class OrderList { constructor(items) { this.items = items; } getTotalPrice() { return this.items.reduce((res, item) => { return res + item.getTotalPrice(); }, 0); } }


同时还,让大家的主相关文件将很单纯,没有分为该工作的方法;它将尽或者单纯(除了英语有很多把手机通讯录,让大家将比较快册除)。


由此,一切仅与两个订单信息项涉及到的方式都应储放在 orderItem 中。比如有一些设备取决于地食用一队 orderItems,企业应有把这点思维放到 orderItems 中。


让我们的主文件目录要不过是两个在口中点;做这些预备和把手机通讯录,并将这些逻辑思维学与另一逻辑思维学沟通好。


一种提取为我国出具了源代码是什么控件直接的少量的依赖关联关联,这也是我国的源代码是什么更易于运维的诱因。


小编没法一直是在小编的工作中安全的使用这一方式,但它就是个尤其好的方式。你你能安全的使用它,你因该这样子做。

创作者

在小编的先前的例子中,小编的有 4 个档案:Main、OrderList、OrderItem 和 Product。相关信息专家团队说方案会在哪些里:在数值坐落的相同个地方。


但的问题是:可以在谁和在哪里建设客体?谁将建设 orderList,谁将建设 orderItem,谁将建设 Product?


Creator 说每次另一半(类)都应有只在操作它的地儿加入。还切记我在主要包括很多引入的主材料中的例子吗?让你检测:


 import { OrderItem } from './OrderItem'; import { OrderList } from './OrderList'; import { Product } from './Product'; const samsung = new Product('Samsung', 200); const apple = new Product('Apple', 300); const lg = new Product('Lg', 150); const samsungOrder = new OrderItem(samsung, 2); const appleOrder = new OrderItem(samsung, 3); const lgOrder = new OrderItem(samsung, 4); const orderList = new OrderList([samsungOrder, appleOrder, lgOrder]); const totalSum = orderList.getTotalPrice();


正如同自己可见,基本上大部分的使用和女朋友打造全部都在 main.js 中。


因为,叫我国顾虑一次它的实打实操作物体和定位。


该货品仅在 OrderItem 中用。 OrderItem 仅在 OrderList 中用。 OrderList 广泛用于 Main。它看上去像这:


Main → OrderList → OrderItem → 產品


然而如Main只使用的OrderList,为社事物说呢.我要在Main中新建OrderItem呢?为社事物说呢.我还有来到里新建一家企业产品?这刻,.我的 Main.js 新建(和导成)基本上所有的事物。这不良。


遵循上帝原则,我们应该只在使用这些对象的地方创建对象。想象一下,使用我们的应用程序,我们将产品添加到购物车。这就是它的样子:


Main.js:他们于这个只新创建(和导进)OrderList:


 import { OrderList } from './OrderList'; const cartProducts = [{ name: 'Samsung', price: 200, count: 2 }, { name: 'Apple', price: 300, count: 3 }, {name: 'Lg', price: 150, count: 4 }]; const orderList = new OrderList(cartProducts); const totalPrice = orderList.getTotalPrice();


OrderList.js:我们公司你在里只打造(和导入到)OrderItem:


 import { OrderItem } from './OrderItem'; class OrderList { constructor(items) { this.items = items.map(item => new OrderItem(item)); } getTotalPrice() { return this.items.reduce((res, item) => { return res + item.getPrice(); }, 0); } }


OrderItem.js:各位你在里只创办(和引入)厂品:


 import { Product } from './Product'; class OrderItem { constructor(item) { this.product = new Product(item.name, item.price); this.count = item.count; } }


护肤品.js:


 class Product { constructor(name, price) { this.name = name; this.price = price; } }


自己还至少有一个简略的依赖症:


主 → OrderList → OrderItem → 產品


现在,每个对象只在使用它的地方创建。这就是造物主原则所说的。


我希望这个介绍对你有用,在下一个系列的GRASP 中,我们将介绍其他原则。


在上拍摄制作的拍照
바카라사이트 바카라사이트 온라인바카라