代码的可扩展性?代码扩展性是什么意思??

发布于 2022-05-19 15:36:49
标签: 代码的可扩展性?代码扩展性是什么意思??代码可扩展性扩展性是什么意思
关注者
15
被浏览
42

1 个回答

欢迎大家关注今日头条号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考

1 六大原则

在设计模式中有六大设计原则:

单一职责原则:一次做一件事

里式替换原则:子类扩展父类

依赖倒置原则:面向接口编程

接口隔离原则:高内聚低耦合

迪米特法则:最少知道原则

开闭原则:关闭修改,开放新增

我认为在这六个原则中开闭原则最为重要,开闭原则是可扩展性的重要基石。

第一个原因是需求变化时应该通过新增而不是修改已有代码实现,这样保证了代码稳定性,避免牵一发而动全身。

第二个原因是可以事先定义代码框架,扩展也是根据框架扩展,体现了用抽象构建框架,用实现扩展细节,保证了稳定性也保证了灵活性。

第三个原因是其它五个原则虽然侧重点各有不同,但是都可以包含于开闭原则。

第四个原因是标准二十三种设计模式最终都是在遵循开闭原则。

既然开闭原则如此重要,我们应该怎么在系统设计时遵循开闭原则呢?


2 数据库维度

2.1 设计类型字段

我们可以在数据表设计时新增两列:biz_type、biz_sub_type,这两个列即使目前用不上,可以先设置一个默认值。

biz_type可以指业务类型,业务渠道、租户等等,归根结底是用来隔离大业务类型,假设后续业务新增了一个大业务类型,那么可以通过这个字段隔离。

biz_sub_type可以在大业务类型中细分小业务,使得业务更加细化,灵活性更好。


2.2 设计扩展字段

我们可以在数据表设计时新增三列:extend1、extend2、extend3,可以先设置为空。扩展字段存储JSON类型信息,存放一些扩展信息、附加信息、松散信息或者是之前未预估到的信息。

之所以设置三个扩展字段是为了增加隔离性,例如extend1存放订单扩展信息,extend2存放商品扩展信息,extend3存放营销扩展信息。


2.3 设计业务二进制字段

2.3.1 需求背景

我们可以在数据表设计时新增业务二进制字段,这个字段可以很大程度上扩展业务表意能力。假设在系统中用户一共有三种角色:普通用户、管理员、超级管理员,现在需要设计一张用户角色表记录这类信息。不难设计出如下方案:

代码的可扩展性(代码扩展性是什么意思?)

观察上表不难得出,用户一具有超级管理员角色,用户二具有管理员角色,用户三具有普通用户角色,用户四同时具有三种角色。如果此时新增加一种角色呢?那么新增一个字段即可。


2.3.2 发现问题

按照上述一个字段表示一种角色进行表设计功能上是没有问题的,优点是容易理解结构清晰,但是我们想一想有没有什么问题?笔者遇到过如下问题:在复杂业务环境一份数据可能会使用在不同的场景,例如上述数据存储在MySQL数据库,这一份数据还会被用在如下场景:

检索数据需要同步一份到ES

业务方使用此表通过Flink计算业务指标

业务方订阅此表Binlog消息进行业务处理

如果表结构发生变化,数据源之间就要重新进行对接,业务方也要进行代码修改,这样开发成本比较非常高。有没有办法避免此类问题?


2.3.3 解决方案

我们可以使用位图法,这样同一个字段可以表示多个业务含义。首先设计如下数据表,userFlag字段暂时不填。

代码的可扩展性(代码扩展性是什么意思?)

设计位图每一个bit表示一种角色:


代码的可扩展性(代码扩展性是什么意思?)


使用位图法表示如下数据表:

代码的可扩展性(代码扩展性是什么意思?)

用户一位图如下其十进制数值等于4:

代码的可扩展性(代码扩展性是什么意思?)


用户二位图如下其十进制数值等于2:

代码的可扩展性(代码扩展性是什么意思?)


用户三位图如下其十进制数值等于1:

代码的可扩展性(代码扩展性是什么意思?)


用户四位图如下其十进制数值等于7:

代码的可扩展性(代码扩展性是什么意思?)


根据上述分析可以填写数据表第三列:

代码的可扩展性(代码扩展性是什么意思?)

2.3.4 代码实例

定义枚举时不要直接定义为1、2、4这类数字,而应该采用位移方式进行定义,这样使用者可以明白设计者的意图。

/** * 用户角色枚举 * * @author 微信公众号「JAVA前线」 * */publicenum UserRoleEnum { // 1 -> 00000001 NORMAL(1, "普通用户"), // 2 -> 00000010 MANAGER(1 << 1, "管理员"), // 4 -> 00000100 SUPER(1 << 2, "超级管理员") ; privateint code; private String description; privateUserRoleEnum(Integer code, String description){ this.code = code; this.description = description; } public String getDescription(){ return description; } publicintgetCode(){ returnthis.code; }}

假设用户已经具有普通用户角色,我们需要为其增加管理员角色,这就是新增角色,与之对应还有删除角色和查询角色,这些操作需要用到为位运算,详见代码注释。

/** * 用户角色枚举 * * @author 微信公众号「JAVA前线」 * */publicenum UserRoleEnum { // 1 -> 00000001 NORMAL(1, "普通用户"), // 2 -> 00000010 MANAGER(1 << 1, "管理员"), // 4 -> 00000100 SUPER(1 << 2, "超级管理员") ; // 新增角色 -> 位或操作// oldRole -> 00000001 -> 普通用户// addRole -> 00000010 -> 新增管理员// newRole -> 00000011 -> 普通用户和管理员publicstatic Integer addRole(Integer oldRole, Integer addRole) { return oldRole | addRole; } // 删除角色 -> 位异或操作// oldRole -> 00000011 -> 普通用户和管理员// delRole -> 00000010 -> 删除管理员// newRole -> 00000001 -> 普通用户publicstatic Integer removeRole(Integer oldRole, Integer delRole) { return oldRole ^ delRole; } // 是否有某种角色 -> 位与操作// allRole -> 00000011 -> 普通用户和管理员// qryRole -> 00000001 -> 是否有管理员角色// resRole -> 00000001 -> 有普通用户角色publicstatic boolean hasRole(Integer allRole, Integer qryRole) { return qryRole == (role & qryRole); } privateint code; private String description; privateUserRoleEnum(Integer code, String description) { this.code = code; this.description = description; } public String getDescription() { return description; } publicintgetCode() { returnthis.code; } publicstaticvoidmain(String[] args) { System.out.println(addRole(1, 2)); System.out.println(removeRole(3, 1)); System.out.println(hasRole(3, 1)); }}

假设在运营后台查询界面中,需要查询具有普通用户角色的用户数据,可以使用如下SQL语句:

select * from user_role where (user_flag & 1) = user_flag;select * from user_role where (user_flag & b 0001 ) = user_flag;

我们也可以使用MyBatis语句:

<select id="selectByUserRole" resultMap="BaseResultMap" parameterType="java.util.Map"> select * from user_role where user_flag & #{userFlag} = #{userFlag}</select><select id="selectByUserIdAndRole" resultMap="BaseResultMap" parameterType="java.util.Map"> select * from user_role where id = #{userId} and user_flag & #{userFlag} = #{userFlag}</select>


3 接口维度

3.1 设计类型入参

接口输入参数一定要设计类型入参,可以与数据库biz_type、biz_sub_type相对应,也可以自定义类型最终翻译与数据库类型相对应。

如果一开始不用区分类型,可以先设置为默认值,但是其核心思想是一定要可以通过类型对输入参数进行区分。

publicclassOrderDTO { private Integer bizType; private Integer bizSubType; private Long amount; private String goodsId;}public Response<String> createOrder(OrderDTO order);


3.2 设计松散入参

接口输入参数可以设计Map类型松散参数,松散参数缺点是表意能力弱,优点是灵活性强,可以以较低成本新增参数。

publicclass OrderDTO { private Integer bizType; private Integer bizSubType; private Long amount; privateString goodsId; private Map<String, String> params;}public Response<String> createOrder(OrderDTO order);


3.3 设计接口版本号

对外接口需要设计版本号,对于同一个接口允许外部业务逐渐切到新版本,新老版本接口会共存一段时间,通过版本号区分。

/order/1.0/createOrder/order/1.1/createOrder


3.4 纵横做设计

我们分析一个下单场景:当前有ABC三种订单类型:A订单价格9折,物流最大重量不能超过9公斤,不支持退款。B订单价格8折,物流最大重量不能超过8公斤,支持退款。C订单价格7折,物流最大重量不能超过7公斤,支持退款。按照需求字面含义平铺直叙地写代码也并不难。

publicclassOrderServiceImplimplementsOrderService{ @Resourceprivate OrderMapper orderMapper; @OverridepublicvoidcreateOrder(OrderBO orderBO){ if (null == orderBO) { thrownew RuntimeException("参数异常"); } if (OrderTypeEnum.isNotValid(orderBO.getType())) { thrownew RuntimeException("参数异常"); } // A类型订单if (OrderTypeEnum.A_TYPE.getCode().equals(orderBO.getType())) { orderBO.setPrice(orderBO.getPrice() * 0.9); if (orderBO.getWeight() > 9) { thrownew RuntimeException("超过物流最大重量"); } orderBO.setRefundSupport(Boolean.FALSE); } // B类型订单elseif (OrderTypeEnum.B_TYPE.getCode().equals(orderBO.getType())) { orderBO.setPrice(orderBO.getPrice() * 0.8); if (orderBO.getWeight() > 8) { thrownew RuntimeException("超过物流最大重量"); } orderBO.setRefundSupport(Boolean.TRUE); } // C类型订单elseif (OrderTypeEnum.C_TYPE.getCode().equals(orderBO.getType())) { orderBO.setPrice(orderBO.getPrice() * 0.7); if (orderBO.getWeight() > 7) { thrownew RuntimeException("超过物流最大重量"); } orderBO.setRefundSupport(Boolean.TRUE); } // 保存数据 OrderDO orderDO = new OrderDO(); BeanUtils.copyProperties(orderBO, orderDO); orderMapper.insert(orderDO); }}

上述代码从功能上完全可以实现业务需求,但是程序员不仅要满足功能,还需要思考代码的可维护性。如果新增一种订单类型,或者新增一个订单属性处理逻辑,那么我们就要在上述逻辑中新增代码,如果处理不慎就会影响原有逻辑。

如何改变平铺直叙的思考方式?这就要为问题分析加上纵向和横向两个维度,我选择使用分析矩阵方法,其中纵向表示策略,横向表示场景:

代码的可扩展性(代码扩展性是什么意思?)


3.4.1 纵向做隔离

纵向维度表示策略,不同策略在逻辑上和业务上应该是隔离的,本实例包括优惠策略、物流策略和退款策略,策略作为抽象,不同订单类型去扩展这个抽象,策略模式非常适合这种场景。本文详细分析优惠策略,物流策略和退款策略同理。

// 优惠策略publicinterfaceDiscountStrategy{ publicvoiddiscount(OrderBO orderBO);}// A类型优惠策略@ComponentpublicclassTypeADiscountStrategyimplementsDiscountStrategy{ @Overridepublicvoiddiscount(OrderBO orderBO){ orderBO.setPrice(orderBO.getPrice() * 0.9); }}// B类型优惠策略@ComponentpublicclassTypeBDiscountStrategyimplementsDiscountStrategy{ @Overridepublicvoiddiscount(OrderBO orderBO){ orderBO.setPrice(orderBO.getPrice() * 0.8); }}// C类型优惠策略@ComponentpublicclassTypeCDiscountStrategyimplementsDiscountStrategy{ @Overridepublicvoiddiscount(OrderBO orderBO){ orderBO.setPrice(orderBO.getPrice() * 0.7); }}// 优惠策略工厂@ComponentpublicclassDiscountStrategyFactoryimplementsInitializingBean{ private Map<String, DiscountStrategy> strategyMap = new HashMap<>(); @Resourceprivate TypeADiscountStrategy typeADiscountStrategy; @Resourceprivate TypeBDiscountStrategy typeBDiscountStrategy; @Resourceprivate TypeCDiscountStrategy typeCDiscountStrategy; public DiscountStrategy getStrategy(String type){ return strategyMap.get(type); } @OverridepublicvoidafterPropertiesSet()throws Exception { strategyMap.put(OrderTypeEnum.A_TYPE.getCode(), typeADiscountStrategy); strategyMap.put(OrderTypeEnum.B_TYPE.getCode(), typeBDiscountStrategy); strategyMap.put(OrderTypeEnum.C_TYPE.getCode(), typeCDiscountStrategy); }}// 优惠策略执行@ComponentpublicclassDiscountStrategyExecutor{ private DiscountStrategyFactory discountStrategyFactory; publicvoiddiscount(OrderBO orderBO){ DiscountStrategy discountStrategy = discountStrategyFactory.getStrategy(orderBO.getType()); if (null == discountStrategy) { thrownew RuntimeException("无优惠策略"); } discountStrategy.discount(orderBO); }}


3.4.2 横向做编排

横向维度表示场景,一种订单类型在广义上可以认为是一种业务场景,在场景中将独立的策略进行串联,模板方法设计模式适用于这种场景。

模板方法模式一般使用抽象类定义算法骨架,同时定义一些抽象方法,这些抽象方法延迟到子类实现,这样子类不仅遵守了算法骨架约定,也实现了自己的算法。既保证了规约也兼顾灵活性,这就是用抽象构建框架,用实现扩展细节。

// 创建订单服务publicinterfaceCreateOrderService{ publicvoidcreateOrder(OrderBO orderBO);}// 抽象创建订单流程publicabstractclassAbstractCreateOrderFlow{ @Resourceprivate OrderMapper orderMapper; publicvoidcreateOrder(OrderBO orderBO){ // 参数校验if (null == orderBO) { thrownew RuntimeException("参数异常"); } if (OrderTypeEnum.isNotValid(orderBO.getType())) { thrownew RuntimeException("参数异常"); } // 计算优惠 discount(orderBO); // 计算重量 weighing(orderBO); // 退款支持 supportRefund(orderBO); // 保存数据 OrderDO orderDO = new OrderDO(); BeanUtils.copyProperties(orderBO, orderDO); orderMapper.insert(orderDO); } publicabstractvoiddiscount(OrderBO orderBO); publicabstractvoidweighing(OrderBO orderBO); publicabstractvoidsupportRefund(OrderBO orderBO);}// 实现创建订单流程@ServicepublicclassCreateOrderFlowextendsAbstractCreateOrderFlow{ @Resourceprivate DiscountStrategyExecutor discountStrategyExecutor; @Resourceprivate ExpressStrategyExecutor expressStrategyExecutor; @Resourceprivate RefundStrategyExecutor refundStrategyExecutor; @Overridepublicvoiddiscount(OrderBO orderBO){ discountStrategyExecutor.discount(orderBO); } @Overridepublicvoidweighing(OrderBO orderBO){ expressStrategyExecutor.weighing(orderBO); } @OverridepublicvoidsupportRefund(OrderBO orderBO){ refundStrategyExecutor.supportRefund(orderBO); }}


4 文章总结

本文介绍了设计类型字段、设计扩展字段、设计业务二进制字段、设计类型入参、设计松散入参、设计接口版本号、纵横做设计这七种增加系统可扩展性方法,希望本文对大家有所帮助。

欢迎大家关注今日头条号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考

相关问答

韩国人口超过五千万,经济基础和网络基础较好,99.2%的家庭通过电脑、移动设备或其他设备上网。有数据分析,韩国人的网购比例高达72%,而且有1500万名是“海淘族”。韩国跨境电商平台有哪些?韩国十大跨境出口电商平台(以下排名不分前后,仅供参考,以最新数据为准)GmarketGmarket是韩国第一名的跨境电商平台,是一个在线拍卖和购物中心,世界各地的用户可以在Gmarket里买卖商品和服务。Gmarket在线销售各种商品,类别包括时尚/美容,数码,食品/婴儿,运动/汽车,家居用品,书籍/ DVD,旅游/票务,e优惠券/票,卡通/游戏等。它是一个综合性的网络购物平台,在2009年被eBay以12亿美元收购了,2010年Gmarket营业额就达到了4.7万亿韩元,注册会员数超过2000万。eBay韩国站ebay于1995年9月4日由Pierre Omidyar以Auctionweb的名称创立于加利福尼亚州圣荷西。人们可以在ebay上通过网络出售商品。eBay韩国站在2016年其交易额就达到了...

电子商务成功的公式在很大程度上取决于通过优化客户体验来提高客户满意度。首先是建立一个可靠的技术和服务堆栈,使您能够监控和评估业务的各个方面,使您能够立即进行调整并纠正路线以获得最佳性能。实现电子商务成功:建立业务的 16 个关键然后,学习如何经营成功的电子商务业务包括了解如何衡量成功,确定影响成功的关键因素,以及在其他企业之前获得竞争优势的方法。为了有效扩展和维持品牌增长,需要考虑几个关键领域,包括从透明跟踪到简化客户退货的方方面面。关键是在每一步都牢记整体客户旅程,并随着购买行为的发展保持灵活性和适应性。如何衡量电子商务的成功?在电子商务方面有一些成功因素。使用数据和分析对于任何公司量化努力和跟踪增长的成功至关重要。应用测量工具来分析库存和客户生命周期价值,使电子商务企业能够有效地预测和扩展,而不会降低服务和产品的质量。成功可以通过透明度跟踪、客户洞察和网络优化来控制。1.透明的交货跟踪实施集成软件可提供从下订单到订单到达客户门口的实时可见性,允许根据需要进行干预,以避免在交付发生变化...

现在人们说建筑工地的农民工月薪一万多元,也就是一天三四百。作为一个建筑行业的老人,我不否认这个行业确实有一些建筑民工月薪超过1万元,但90%左右的农民工月薪都在1万元以上。也就5000元左右。今天,鱼泡小编就给大家盘点一下建筑工地最赚钱的5大工作。这些工作确实比另一个更赚钱,但它们也比另一个更危险!第一、建筑工地电工因为现在的工地布线不是很规范,下雨等恶劣天气经常会漏电,电工检修时经常会触电,对任何人来说都是非常危险的。第二、焊工随着钢结构建筑和装配式建筑的发展,工地对电焊工的需求逐渐增加,工资也在不断上涨。一般日薪在300元左右。工资高的主要原因不仅是因为技术要求高,还因为工作中产生的废气和电灯会对身体造成严重的伤害。第三、施工现场的木工工地上的木工不是家居装修的木匠。它比家装木工具有更高的工作强度和更高的技术要求。现在木工一天挣三四百不是问题,但每天至少工作10个小时,而且还容易受伤。第四、框架框架是一种高空作业。必须验证作业。对技巧和勇气的要求很高,工作也很危险。 ”。现在...

平面设计岗位单日岗位发布量高达80000+*数据来源前程无忧01 / 平面设计方向02 / 网页设计方向03 / UI视觉设计方向04 / 交互设计方向05 / 产品经理方向* 个人工作室与手绘/插画方向薪资收入与个人设计水平和个人业务量而定。UI设计公司种类及岗位设置类型1:广告/平面设计公司▶简介:专门经营广告/平面设计业务活动的企业。▶工作内容:①平面设计公司主要从事平面视觉表现类的设计业务,如字体设计、版式设计、企业VI设计等;②广告公司所涉及的业务范围更广,涵盖企业产品与业务推广的整体流程:咨询、策划、制作、发布、反馈信息、评估效果等方面,设计方面的工作有网站建设、VI设计、广告/宣传片制作、海报设计、产品包装设计、APP设计、H5策划与制作等等。▶岗位设置:平面设计师、视觉设计师、交互设计师、产品经理、影视动画制作师等。类型2:互联网公司▶简介:广义的互联网企业是指以计算机网络技术为基础,利用网络平台提供服务并因此获得收入的企业,如Google、阿里巴巴、百度、网易、腾讯、京...

S2B2C是一种集合供货商赋能于渠道商并共同服务于顾客的全新电子商务营销模式。S2B2C中,S即是大供货商,B指渠道商,C为顾客。S2B2C出处阿里巴巴总参谋长、湖畔大学的曾鸣教授提出了S2B2C的模式。他认为,行业里存在大量的高度分散的小商户b(小b表示体量),有接触和搞定C端用户的强大能力,但缺乏标准化供应链S的支持,难以做强做大。因此,它们需要一个供应链平台S,来提供立体化的赋能(服务),放大它们与C端用户之间的交易规模。S2B2C模式中,一方面,将优秀的供货商筛选出来供渠道商集中采购,另一方面,提供SaaS工具、技术支持、培训给渠道商使其能更好地为顾客服务。简而言之,S2B2C的重点是,大供货商(S)一要整合上游优质供应商,二提供给渠道商(B)各种技术、数据支持,三辅助渠道商(B)完成对顾客(C)的服务,而渠道商(B)在其中的作用则是一对一沟通顾客(C),发现需求并定制需求,同时将这些信息反馈给大供货商(S),以便落实顾客(C)所需的服务。北京大学光华管理学院工商管理博士后穆胜认...

说到企业营销的方式,至今仍有无数人认为企业SEO优化,即搜索引擎优化推广才是企业营销的唯一选择,但实际上,随着互联网的迅速发展,以及众多新闻源媒体、自媒体等媒体渠道的出现,人们获取信息的途径随着增加,“碎片化”成为信息发布的主要特征,对于企业来说,也意味着当前的流量已经不再局限于一个集中的平台,而是呈分散态势分布在不同平台。因此,像SEO优化这样单一的营销方式,已经不再能跟上企业发展的脚步。随着网络技术的高速发展和迅速普及,全网营销推广成为企业在SEO优化之外的常用营销手法,越来越多的企业开始关注全网营销的重要性和迫切性,并思考应该如何做好全网营销来达到提升品牌知名度的目的。目前而言,全网营销推广才是企业营销的正确打开方式。优势全网营销推广可以极大地降低企业的宣传成本,提升品牌的知名度,有利于品牌宣传,并发掘全新的顾客群体;可以占领更多的市场资源,提高客户成交量,从而增加线上线下的整体销量,快速清理库存,通过低成本打开市场;能够拓宽营销渠道及客户的信任度和转化度,增强客户粘性,提高客户对...

 S2B2C模式是电子商务的一种商业模式,随着电子商务的不断发展,S2B2C模式也衍生出不同类型的商业模式。下面是易族智汇javashop为您编辑整理的S2B2C商业模式是什么,家居行业的S2B2C模式有哪些,希望能帮到您。S2B2C商业模式是什么?  S2b的创新模式,其核心是S2b2c,传统的B2B或者B2C模式对于三者是呈割裂状态的,S2b2c模式最大创新在于S和小b共同服务c。小b服务c离不开S平台提供的种种支持,但是S也需要通过b来服务c。S和众多的小b是紧密的合作的关系,而不是传统B2B的简单商务关系,或者B2C的管理关系。S2b2c是一个创新的商业模式,S2B2C模式比传统的B2B模式或者B2C模式要复杂。但是由于互联网技术的进步,这样一种比以前更复杂的模式有了实际运转的可能性,而且,更重要的是,这个模式能够能够带来比传统模式更多的价值创新,这才是S2b2c模式的意义所在,也是它的未来所在。因此,S2b不是传统的加盟体系,而是一个创新的协同网络,S通过五个维度对小b进行赋能...

主流的关键词优化排名方法,翻来覆去就那几种,要么做seo优化,要么做sem竞价推广。此刻,或许你会提出:为什么其他手段都是非主流?搜椰君告诉你哈:要么效果不稳定,要么花钱如流水,自然就成了非主流。一、关键词优化排名方法-seo优化seo优化需要依赖网站或其他第三方平台进行关键词优化布局,网站就像是自己的家一样,想放什么关键词,发布什么文章内容都可以,宽容度比较大,愿意装下和包容你的所有,比如品牌名称、多种联系方式可以展示;而第三方平台就像是去朋友家做客一样,做什么关键词和内容得按照第三方平台的规则(在朋友家应该按照他人家里规则和要求做好客人的行为)受限的比较多比如很多品牌名称、联系方式等是不允许出现的。此处过度来啦~由于seo关键词优化排名有一定的限制,即使是网站自己的田地发布也需要一定的时间才能见效,一般按周、按月计算见效;一般企业在网络营销策略考虑,seo推广优化比较适合用于中小企业,大企业较低利润的产品进行推广、长尾词的优化等,seo优化需要持续、周期性的输出,流量品质和转化高。但...

欢迎大家关注今日头条号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考1 六大原则在设计模式中有六大设计原则:单一职责原则:一次做一件事里式替换原则:子类扩展父类依赖倒置原则:面向接口编程接口隔离原则:高内聚低耦合迪米特法则:最少知道原则开闭原则:关闭修改,开放新增我认为在这六个原则中开闭原则最为重要,开闭原则是可扩展性的重要基石。第一个原因是需求变化时应该通过新增而不是修改已有代码实现,这样保证了代码稳定性,避免牵一发而动全身。第二个原因是可以事先定义代码框架,扩展也是根据框架扩展,体现了用抽象构建框架,用实现扩展细节,保证了稳定性也保证了灵活性。第三个原因是其它五个原则虽然侧重点各有不同,但是都可以包含于开闭原则。第四个原因是标准二十三种设计模式最终都是在遵循开闭原则。既然开闭原则如此重要,我们应该怎么在系统设计时遵循开闭原则呢?2 数据库维度2.1 设计类型字段我们可以在数据表设计时新增两列:biz_type、biz_sub_type,...

什么是子域名?子域名(或子域;英语:Subdomain)是在域名系统等级中,属于更高一层域的域。比如,mail.fuyeor.com 和 docs.fuyeor.com 则是 fuyeor.com 的两个子域,而 fuyeor.com 则是顶级域 .com 的子域。在网站领域中,子域名 / 二级域名一般指主域名下一级的域。例如 docs.fuyeor.com 就是一个子域名 / 二级域名域名有顶级域名和二级[1],三级之分,一般网站只用到顶级域名即可,有时候一个网站系统比较庞大,那么就可能使用多个域名,如果去申请多个域名肯定不划算,这个时候,使用已申请的一个域名的二级域名的处理方式就应运而生。比如 http://fuyeor.com 这个主域名,将 http://fuyeor.com 绑定了一个地址,http://docs.fuyeor.com、http://video.fuyeor.com 等等域名也绑定到了各个地址,不用在单独花钱购买或者备案。只是购买了 http://fuyeor....

撰写答案

请登录后再发布答案,点击登录
相关推荐

全渠道营销模式(全渠道营销是什么意思)

从DTP到全渠道营销,我国药企的营销模式,伴随着国谈集采打破医院内市场为主,向院外如药店、线上、社区、县域、诊所等全渠道市场放射,院内院外一体化,线上线下一体化,成为药企最常挂在嘴...
全渠道营销模式(全渠道营销是什么意思)
全渠道营销模式(全渠道营销是什么意思)
全渠道营销模式(全渠道营销是什么意思)
全渠道营销模式(全渠道营销是什么意思)

市场营销的五大核心要素(市场营销的三要素是什么)

在现代市场营销理论中,市场细分、 目标市场、市场定位是构成公司营销战略的核心三要素,被称为STP营销。市场细分是指营销者通过市场调研,依据消费者的需要和欲望、购买行为和购买习惯等方...
市场营销的五大核心要素(市场营销的三要素是什么)

koc是什么 营销(什么是KOL营销)

对于希望在社交媒体上接触目标受众的品牌来说,KOL营销已经成为一种主流的成功策略。相对于成本越来越高的广告成本,KOL营销可观的回报率是强大的。本篇文章,我们将探讨什么是KOL,以...

易拓客软件怎么样(大数据拓客是什么)

大数据营销软件怎么样?大数据营销软件可以满足现在企业拓客的营销所需,采集自己需要的目标客户群体,然后导入微信,短信,,进行自动化营销。大数据营销软件提供的便利就是代替人工操作,为企...
易拓客软件怎么样(大数据拓客是什么)

创业创新执行力是什么课程(根据课程教育行业营销进阶课)

基于创新能力培养的市场营销课程CAI教学模式的总体思路创新能力(创造力)实际上是一种集合能力,它是由多种能力组合而成的,一般包括知识(包括书本知识、实践经验知识)、创造性思维方法和...

外呼系统公司(电销外呼系统是什么)

现如今,越来越多销售型企业开始摒弃传统电销模式,因为他们意识到传统电销模式效率低下,已经无法适应现如今的通讯规则和销售需求,许多企业开始转向使用新型电销模式,使用电销外呼系统取代传...
外呼系统公司(电销外呼系统是什么)

法律产生的两种方式是什么(钉钉直播回放什么时候形成)

Tech星球5月24日消息,据央视网,钉钉正在研发一项定位为视频号的新产品,将以短视频、直播两种方式上线。近日浙江大学125周年校庆就采用了钉钉视频号的直播支持,吸引了超40万人次...
法律产生的两种方式是什么(钉钉直播回放什么时候形成)

来自云南的小镇乡村是什么歌?

出品 | 虎嗅青年文化组作者 | 黄瓜汽水编辑、题图 | 渣渣郡本文首发于虎嗅年轻内容公众号那個NG(ID:huxiu4youth)。在这里,我们呈现当下年轻人的面貌、故事和态度。...
来自云南的小镇乡村是什么歌?
来自云南的小镇乡村是什么歌?
来自云南的小镇乡村是什么歌?
来自云南的小镇乡村是什么歌?

社会刻板和晕轮效应差别例子(人力资源中晕轮效应是什么意思)

晕轮效应 又称成见效应、光环效应等,指人们在交往认知中,对方的某个特别突出的特点、品质就会掩盖人们对对方的其他品质和特点的正确了解。这种错觉现象,心理学中称之为晕轮效应。美国心理学...
社会刻板和晕轮效应差别例子(人力资源中晕轮效应是什么意思)

自媒体大v是什么意思(什么是自媒体思维)

大家好!我是Tina。今天想和大家聊一聊自媒体思维这个话题。原因是在我的写作社群里,经常有学员问,发出去的内容展现量很少,该怎么办?其实,在零基础特训营里,我早已讲过爆款微头条的写...
自媒体大v是什么意思(什么是自媒体思维)
自媒体大v是什么意思(什么是自媒体思维)
自媒体大v是什么意思(什么是自媒体思维)
自媒体大v是什么意思(什么是自媒体思维)

发布
问题

分享
好友

手机
浏览

扫码手机浏览