高级程序员必会的程序设计原则 —— 普适性原则

2024-01-13 22:59

本文主要是介绍高级程序员必会的程序设计原则 —— 普适性原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

当我们开始准备创造一个伟大的项目时,势必会考虑到未来的扩展性,希望能够成为一个通用的解决方案来解决一类问题。从定制到通用,从特殊到一般的转变需要先从抽象层面去寻找不同项目的共性并提炼它们。

简记

一个模块在解决相同或类似需求时,它不应只局限于或受制于上层模块,应当可以很容易的被其他上层模块或其他项目引用。

如何让一个模块普适化

让程序普适化可以与具体实现解耦

图1、让程序普适化可以与具体实现解耦

比如我们在编写一个文本编辑器时,需要考虑打开一个文本文件,并自动判断它是gb2312编码还是utf-8编码,这段程序可能一开始会耦合在我们的业务代码中,入参也许是TextBox(文本框)、EditorContext(上下文)、OpenFileDialog(打开文件对话框)。这便要求了自动推断编码的这段程序只能放在当前项目里,当我们需要复用该模块时,要么下个项目也用同样的入参、构造其上层模块,要么就只能把入参改为String或者byte[],然后用上层对象的getText()或readAllBytes()之类的方法来耦合我们改造好的模块。

既然我们在做第二个项目的时候总是要改这个模块,为什么不在一开始写的时候就让这个模块只依赖编程语言自带的对象呢?

都说“众口难调”,我们在这里调的就是各个模块的“众口”。

有些时候我们可以通过定义恰当的参数列表来完成普适性。而有些时候我们可以通过依赖某个公共类、增加回调函数、添加生命周期钩子的方式来协调不同项目对相同模块的要求。

为了能够让模块更加普适,我们不一定非要让模块更加复杂,也许反而我们可以让它更简单一些,比如依赖接口开发而不是具体实现、像大多数JSON框架一样引入泛型机制,因此普适性和复杂度某种程度上并不具备相关性。

功能上,如果A模块比B模块判断的场景更多、功能更丰富,那么A模块便会比B模块更通用。如果一个模块是可配置的,那么配置式模块的普适性一定会大于约定式模块。

关于究竟是约定大于配置还是配置大于约定,在业内有过很激烈的讨论,但至今没有结论。这是因为二者都是为了实现普适性,但站的角度不同而已。约定大于配置会假定各方都是如此,没有必要显式声明,从而实现各种项目普适化的敏捷。配置大于约定会假定各方的情况都不一样,需要明确配置项,从而实现各种项目普适化的需求。

毕竟“小孩子才会做选择,成年人全都要”。如果既要普适化的敏捷又要完成普适化的需求,则一个很好的案例可以学习Spring框架,它用多套各自平行又能相互融合的解决方案解决了这一问题。我们可以深入地配置(比如XML、properties、yml或者写Class)、也可以只需遵守约定(比如注解)。

为了能够实现普适性,我们可以采用以下几种方法:1、使用配置文件,让模块可以通过配置来适应不同环境。2、使用上下文或参数化对象来适配不同需求。3、添加枚举或常量,并在恰当的地方让用户可以自行选择模块的行为。4、进行适当抽象或采用面向接口的方式开发。

但也要注意的是,普适性原则关注的是通用模块、平台模块,而非业务领域模块,如果我们非要在业务上做普适性,根据复杂度守恒原则,我们没有办法让得到普适性的模块更加纯粹,这便会导致平台内聚效应,底层平台的功能愈发强大,而我们在实现业务的层面没有得到任何的提升,只是增加了复杂性,但现实中由于架构师经验丰富,便容易因为恐惧而徒增了大量的普适性适配,因此好的架构应当是桶状结构,而非金字塔结构。它带来的另一个问题便是如果模块通用度极强,可以完成相当非常复杂的实现,但我们经常显而易见的简单功能,它却很难完成,我们不得不显式的排除各种干扰因素,使之符合一个明确的预期。
不合理的金字塔架构
图2、正金字塔型架构等于大炮打蚊子,倒金字塔型架构等于产品皆仅供演示

总结

当一名程序员开始考虑如何让手头的项目进行普适化改造时,他不知不觉中便开始进入了架构设计领域。一个好的软件架构其实是一种高度普适化的产品,它可以用来解决一类问题或称为跨越各行各业的通用解决方案。但当项目还未成型时过早的去普适化项目,会成为拖累项目进展甚至导致项目失败的一个重要原因。所以时机应当选择在项目结束以后,花费不少于项目研发的时间去做普适化,一个公司的技术积累其实就是用普适化了多少模块和产品来衡量的。但由于有些单位和企业做项目比较浮躁,因此就会呈现出做一个项目扔一个项目的现象,项目结束了便不再投入资源去凝练它,不仅白白浪费了研发人员的工作成果,更是浪费了社会资源。而我们作为研发人员唯一能做到的就是,如果接手了前人的项目,先不要着急全盘否定它,而是试图去增强和优化它,只有做到足够长时间的沉淀,项目才会成为产品,产品才会成为技术。

这篇关于高级程序员必会的程序设计原则 —— 普适性原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/603093

相关文章

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少