不知道大家如何认为的,一个编译好的组件,或者模块,仅仅是给其他程序调用使用的吗?这个不是这个问题的本质面,
我认为是这个API或者模块是给人设计的,一般而言,每一个组件或者模块都包含很多文档(也可能是XML注释的形式出现),真至于作者还是写了Demo,但是很多方面,人们并没有按照读者的角度来或者说没有按照API是人在使用的观点来组织这些说明性文件,想当然地会加入很多阅读者不可以理解的部分或者不需要暴露给读者的部分,或者这个API设计的很难理解和使用,毕竟最终需要人把这个模块整合到系统中的,也就是说其他模块会引用它,或者它引用其他模块。更加普遍的事情则是,没有描述清楚模块之间或者模块对外部程序的版本依赖,也没有提供测试这些依赖关系的tool,照成的结果是,如果一个模块依赖于一个版本>3.0 的XML paser,而读者并没有得到明确的指示,而安装了<3.0的版本,那么这个模块一部分功能受到影响,而糟糕的是,这个模块在系统加载了,引用它的所有模块潜在地受到了低版本XML parser的影响,系统的在一些功能上可以是“不完备”的状态!在模块很多,比如好几千个,即使上百个的话,没有一个明确的依赖关系(版本)的检查,
系统的稳定性和可信性将受到使用者的质疑!如果有一个这个版本检查机制,那么系统就不会加载可能存在潜在危险的模块,这样也就挽救了系统,也能给予用户提示(提示它们尽快更新这个依赖),还可以在系统加载的时候,检查版本时,发现被依赖的模块不存在或者版本不满足要求,检查工具可以自动到网络下载相应的版本!为应用的完备性提供了保障!
所以,在设计之初,就应该考虑到,我们在设计一个API或者模块或者框架的时候,应该考虑的是,在使用者无需知道更多细节的情况下就能部署或者使用它,并且提供完备的可以理解的为人类阅读的文档,也需要提供一个完备版本控制机制和检查工具!在明确这样的情况下,每一个模块甚至于可以由每个独立的小组或者分布式的小组完成,因为它们有明确的依赖关系、管理以及检查工具,这也为开发带来了便利。
以上实际上是谈论了两个问题:如何才是好的API,以及依赖版本的管理必要性。
对于,要设计好的API,我们可以使用经验型设计的方式,也就是说,如果一个使用者“使用”它最低的经验就能容易地使用我们的组件,并且可以轻易地满足各种情况,那么这个API至少就是好的,对于使用者而言,他们甚至于可以不去看文档就可以轻易使用这些组件,即使它们能够“乱序”的使用!这些对设计API的人提出更高的要求,因为必须考虑得很“周全”,而且做到“简单就好”,往往对设计人和开发者有更多的挑战!所以往往达不到理想的状态,但是至少核心的组件,应该能做到这样的要求,因为越是复用性强的组件,越是很容易被别的组织拿去用!那么可以将主要精力放在这些东西上!其他的部分,视情况而定!
对于好的依赖管理:最好的方式是让tool去检查,开发时让一个集中版本控制机制进行管理,另外可能大多数人会认为往往第一个版本的是容易的,但是事实并非如此,依赖除了版本依赖,还有一个兼容性的依赖关系:
没有开发人员会使用API总在变化的组件或者模块,因为需求的变化,我们往往要升级组件,这会带来问题,
第一:可能API变化,不兼容现有的客户程序了,那么使用它的组织会很恼火!因为他们不得不配合这个组件做对自己产品的变更,成本会比较高!之后就没有任何一个人使用这个组件了!
第二,增加了API,原来的API行为保持不变!这个还比较好,至少使用方的程序,至少现有的程序不受影响,那么对于这个策略,设计者应该是只增加API而不减少和在改进原有API时而不改变其行为!不过我认为这是好的策略中的第二,或者是中策!
第三,最好的办法是,在第一个版本的时候,就尽可能地依赖经验和普遍的原则设计和实现这个第一版本,这也许是可能的,而且这样会减少采取第二策略的可能性,让一个API在长久的使用周期中看起来就像一个百年建筑一样可信!人们就是喜欢使用这样的组件了!不过做到这一点非常困难,的确非常困难,需要大量的提炼和努力,不过也是可以达到的,不是吗!所以不要以为第一个版本就可以轻而易举的实现,我们应该为它做出最好的规划!
分享到:
相关推荐
3. 首先安装"cydia依赖(先装依赖再装cydia)"中的所有deb文件,按照文件内的指示或依赖关系进行排序。 4. 安装完依赖后,再安装Cydia的主应用程序,如Cydia_1.1.1_iphoneos-arm.deb和Cydia_1.1.6.deb。 5. 安装完成...
2. **集成SDK**:将BaiduMapApi_Lib_Android_1.3.2.zip中的库文件导入到项目中,正确配置依赖关系。 3. **权限设置**:确保AndroidManifest.xml中添加了必要的权限,如访问网络、读写外部存储等。 4. **处理定位**:...
10. **ASP.NET Core**:如果面试的是Web开发岗位,需要理解ASP.NET Core的基本架构,路由系统,中间件,依赖注入以及MVC和Web API的使用。 11. **ADO.NET与Entity Framework**:了解数据库访问技术,如ADO.NET的...
使用场景涵盖系统自动登录、账户余额查询和动态号码管理等方面的工作流程优化,在使用时需特别关注接口间的依赖关系,注意频率限制避免被封号的风险。 需要注意的是由于各功能点之间的强关联性,使用者需要熟悉整个...
根据数据的访问模式选择 SQL 或 NoSQL 数据库,并做好数据模型和索引策略的设计,以确保数据的完整性和访问效率。 **4. 设计应用程序架构** - **模块化和服务导向**: 采用模块化和服务导向的设计可以提高软件的可...
FastAPI基于Python的类型注解,提供了自动化的API文档和强大的依赖注入,使得代码更易读、更易于维护。Starlette则是一个轻量级的ASGI(Asynchronous Server Gateway Interface)框架,它是FastAPI的基础,可以用于...
1. **关系型数据库**(如 MySQL、Oracle、SQL Server):使用 SQL 语言进行查询和管理。学习如何设计合理的数据库架构,理解 SQL 语句的编写和优化技巧对于后端开发人员来说至关重要。 2. **NoSQL 数据库**(如 ...
- Kestrel服务器和反向代理(如IIS、Nginx)的关系。 - Dependency Injection(依赖注入)在ASP.NET Core中的应用。 面试题可能还会涉及其他主题,如错误处理、调试技巧、代码优化、单元测试等。通过深入理解和...
Gradle仓库管理这些依赖的版本和依赖关系,确保项目构建时能正确获取并解析所需的所有依赖。 在`gradle-3.0-milestone`中,可能包含以下关键改进和特性: 1. **性能提升**:Gradle 3.0致力于提高构建速度,这可能...
在IT行业中,Spring Boot、Quartz和MySQL是三个非常重要的技术组件,它们分别代表了微服务开发框架、任务调度框架和关系型数据库管理系统。这里我们将深入探讨如何将它们结合使用,构建一个基于Spring Boot的动态...
"为Seam做好准备"这个标题暗示我们即将探讨的是关于Seam框架的入门与准备工作。Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他...
通过引入新的依赖解析算法,Gradle现在能够更快地分析和解决项目依赖关系,显著减少了构建时间。此外,Gradle 6.0还改进了缓存策略,增强了本地和远程缓存的使用效果,使得重复构建更为高效。 在插件方面,Gradle ...
Hibernate支持多种关联映射,包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。关联映射的配置直接影响数据的存取方式和性能。 10. **高级特性** Hibernate支持 ...
以下是一份详细的Java开发学习路线,帮助你从入门到精通,为面试做好充分准备。 首先,你需要掌握Java编程语言的基础。这包括理解基本的数据类型(如int、float、char等)、控制流程(if语句、for循环、while循环)...
Maven 使用一种标准的项目对象模型(Project Object Model,POM),通过POM文件来管理项目的构建、报告和依赖关系。"apache-maven-3.5.0"是Maven的特定版本,发布于2017年,提供了许多改进和新特性。 在描述中提到...
通过解决这些问题,你可以深化对C#和.NET的理解,提高你的编程和问题解决能力,为应对实际工作中的挑战做好准备。无论是初学者还是有经验的开发者,都应该定期回顾和实践这些面试题,以保持技术的敏锐度和竞争力。
【标题】:“【面试资料】-(机构内训资料)SpringBoot面试专题.zip”这个压缩包文件主要聚焦于SpringBoot技术在面试中的常见问题和核心知识点。...在面试中,对这些知识点的深入理解和应用将大大提高你的竞争力。
Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。在SSH整合中,Spring作为整体应用的“粘合剂”,可以将Struts 2的动作与业务服务连接起来,并通过其强大的事务管理功能确保数据的一致性。 Hibernate...
40. Spring框架的核心特性,如依赖注入和AOP。 41. Spring Boot的启动过程和自动配置机制。 42. 使用Spring MVC构建RESTful API。 十五、数据库操作 43. JDBC的基本操作,包括连接数据库、执行SQL和处理结果集。 44...
8. **Package**:ROS的代码组织单位,包含了源码、资源配置、依赖关系等。 9. **Catkin**:ROS的构建系统,负责编译和打包ROS项目。 10. **Gazebo**:ROS集成的仿真环境,可以模拟真实世界的物理规则,用于测试和...