当前位置:首页 > 数码 > 架构师之路-成为一名成功的软件架构师的综合指南 (架构师之路)

架构师之路-成为一名成功的软件架构师的综合指南 (架构师之路)

admin5个月前 (05-09)数码20

在软件开发中,构建模块化、可裁减和易保养的运行程序是每位架构师的指标。本文将引见如何设计和成功一个模块类来构建一个模块化编程框架,以便更好地控制和裁减运行程序配置。

引言

在软件开发中,模块化编程是一种关键的架构方法。它将运行程序合成为多个相互独立的模块,每个模块担任不同的义务。这种方法使得代码更易保养、更易裁减,也更易重用。本文将引见一个繁难而弱小的模块化编程框架,它包含两个关键组件: 模块类 (Module)和 模块工厂类 (ModuleFactory)。这两者的联合为开发者提供了一种灵敏的形式,可以轻松地创立和控制模块。

模块类(Module)

设计

模块类 是模块化编程框架的外围。每个模块都是一个承袭自Module的类。模块类有一个名字属性,用于惟一标识每个模块。

classModule{public:Module()=default;virtual~Module()=default;conststd::string&getModuleName()const{returnmoduleName_;}protected:voidsetModuleName(conststd::string&name){moduleName_=name;}private:std::stringmoduleName_;friendclassModuleFactory;};

在上述代码中,Module类包含了以下关键局部:

setModuleName方法的私有访问权限确保只要ModuleFactory类能够修正模块的名字。

模块工厂类(ModuleFactory)

设计

模块工厂类 是一个用于创立和控制模块的中心枢纽。每个模块肯定在工厂中启动注册,以便能够经过工厂创立和失掉模块的实例。

classModuleFactory{private://外部结构体,用于标识模块structmoduleid{moduleid()=default;moduleid(std::stringn,std::size_th):name(std::move(n)),code(h){}explicitmoduleid(conststd::type_info&info):name(info.name()),code(info.hash_code()){}booloperator==(constmoduleid&mid)const{returnname==mid.name&&code==mid.code;}std::stringname;std::size_tcode=0;};public://失掉ModuleFactory的单例实例staticModuleFactory&getFactory(){staticModuleFactoryfactory;returnfactory;}//失掉注册在工厂中的模块称号汇合conststd::unordered_set<std::string>&getModuleNames()const{return*moduleNames_;}//用于注册模块的辅佐结构体template<typenameT,typenameC=T>structModuleRegisterHelper{//结构函数,用于注册模块template<typename...Args>ModuleRegisterHelper(std::stringn,Args&&...args){automptr=getFactory().moduleMapTable_;if(mptr->find(n)!=mptr->end()){throwstd::invalid_argument("模块"+n+"曾经注册。");}getFactory().moduleNames_->insert(n);std::function<std::unique_ptr<Module>(Args...)>create_func=[](Args...args){returnstd::unique_ptr<T>(newT(std::forward<Args>(args)...));};conststd::anyconst_any=std::any(create_func);(*mptr)[n]=std::make_pr(moduleid(typeid(C)),const_any);}};//失掉指定称号和类型的模块template<typenameT=Module,typename...Args>typenamestd::enable_if<std::is_base_of<Module,T>::value,std::unique_ptr<T>>::typegetModule(conststd::string&n,Args&&...args){automptr=getFactory().moduleMapTable_;automiter=mptr->find(n);if(miter==mptr->end()){throwstd::runtime_error("找不到称号为"+n+"的模块。");}if(miter->second.first==moduleid(typeid(T))){automoduleCreator=std::any_cast<std::function<std::unique_ptr<Module>(Args...)>>(miter->second.second);std::unique_ptr<Module>module=moduleCreator(std::forward<Args>(args)...);module->setModuleName(n);returnstd::unique_ptr<T>(static_cast<T*>(module.release()));}automoduleCreator=std::any_cast<std::function<std::unique_ptr<Module>(Args...)>>(miter->second.second);std::unique_ptr<Module>module=moduleCreator(std::forward<Args>(args)...);if(!dynamic_cast<T*>(module.get())){throwstd::runtime_error("无法将模块"+n+"发生的类型转换为"+typeid(T).name());}module->setModuleName(n);returnstd::unique_ptr<T>(static_cast<T*>(module.release()));}private:staticstd::unordered_map<std::string,std::pair<moduleid,std::any>>*moduleMapTable_;staticstd::unordered_set<std::string>*moduleNames_;ModuleFactory(){}ModuleFactory(constModuleFactory&)=delete;ModuleFactory(ModuleFactory&&)=delete;};

在ModuleFactory类中,可以创立、失掉和控制已注册的模块。

注册模块

要经常使用模块工厂创立模块,须要首先注册模块。这里是经过ModuleFactory::ModuleRegisterHelper模板类来成功的。在注册模块时,须要提供模块的类型和名字。

可以经常使用又爱又恨的宏,防止了手动编写少量的注册代码:

架构#defineMODULE_VARIABLE_NAME(module_name,module_type)Module_##module_name##_##module_type##_#defineREGISTER_MODULE(module_name,module_type,...)staticmodule::ModuleFactory::ModuleRegisterHelper<module_type>MODULE_VARIABLE_NAME(module_name,module_type)(#module_name,##__VA_ARGS__)#defineDECLARE_MODULE(module_type,...)REGISTER_MODULE(module_type,module_type,##__VA_ARGS__)

解释如下:

REGISTER_MODULE("MyModule",MyModule);

不青睐经常使用宏则可以:

template<typenameT,typename...Args>voidregisterModule(conststd::string&moduleName,Args&&...args){staticModuleFactory::ModuleRegisterHelper<T>helper(moduleName,std::forward<Args>(args)...);}

注册模块:

registerModule<MyModuleType>("MyModule",arg1,arg2);

经常使用模块

上方是一个示例,展现如何经常使用模块类和模块工厂类来创立和控制模块。

//定义一个模块类classMyModule:publicModule{public://自定义模块的行为};//注册模块REGISTER_MODULE("MyModule",MyModule);intmain(){//经常使用模块工厂创立模块ModuleFactory&factory=ModuleFactory::getFactory();MyModule*module=factory.getMultiModule<MyModule>("MyModule");//经常使用模块if(module){std::cout<<"Createdmodule:"<<module->getModuleName()<<std::endl;}return0;}

名目经常使用案例:

上方以虚构商城系统为例,展示如何经常使用模块类和模块工厂类来创立虚构商城系统,包含购物车控制、用户注册和商品控制等多个模块。

首先,创立购物车控制模块:

#include"Module.h"classShoppingCartModule:publicmodule::Module{public:ShoppingCartModule(){setModuleName("ShoppingCartModule");}voidexecute()override{std::cout<<"ShoppingCartManagementModuleexecuted."<<std::endl;//参与购物车操作addToCart("Product1",10.0);addToCart("Product2",15.0);displayCartContents();calculateTotal();}voidaddToCart(conststd::string&item,doubleprice){cart.push_back(std::make_pair(item,price));std::cout<<"Added"<<item<<"tothecart.Price:"<<price<<"USD"<<std::endl;}voiddisplayCartContents(){std::cout<<"CartContents:"<<std::endl;for(constauto&item:cart){std::cout<<item.first<<"-"<<item.second<<"USD"<<std::endl;}}voidcalculateTotal(){doubletotal=0.0;for(constauto&item:cart){total+=item.second;}std::cout<<"TotalCartValue:"<<total<<"USD"<<std::endl;}private:std::vector<std::pair<std::string,double>>cart;};DECLARE_MODULE(ShoppingCartModule);

而后,创立用户注册模块:

#include"Module.h"classUserRegistrationModule:publicmodule::Module{public:UserRegistrationModule(){setModuleName("UserRegistrationModule");}voidexecute()override{std::cout<<"UserRegistrationModuleexecuted."<<std::endl;//用户注册操作registerUser("User1");registerUser("User2");displayRegisteredUsers();loginUser("User1");}voidregisterUser(conststd::string&username){users.push_back(username);std::cout<<"Registerednewuser:"<<username<<std::endl;}voiddisplayRegisteredUsers(){std::cout<<"RegisteredUsers:"<<std::endl;for(conststd::string&user:users){std::cout<<user<<std::endl;}}voidloginUser(conststd::string&username){std::cout<<"User"<<username<<"loggedin."<<std::endl;}private:std::vector<std::string>users;};DECLARE_MODULE(UserRegistrationModule);

最后,创立商品控制模块:

#include"Module.h"classProductManagementModule:publicmodule::Module{public:ProductManagementModule(){setModuleName("ProductManagementModule");}voidexecute()override{std::cout<<"ProductManagementModuleexecuted."<<std::endl;//商品控制操作addProduct("Product1",10.0,20);addProduct("Product2",15.0,15);displayProducts();showProductDetails("Product1");}voidaddProduct(conststd::string&product,doubleprice,intquantity){products.push_back(std::make_pair(product,std::make_pair(price,quantity));std::cout<<"Addednewproduct:"<<product<<"Price:"<<price<<"USDQuantity:"<<quantity<<std::endl;}voiddisplayProducts(){std::cout<<"AvailableProducts:"<<std::endl;for(constauto&product:products){std::cout<<product.first<<"-Price:"<<product.second.first<<"USDQuantity:"<<product.second.second<<std::endl;}}voidshowProductDetails(conststd::string&product){for(constauto&p:products){if(p.first==product){std::cout<<"ProductDetails-"<<product<<":"<<std::endl;std::cout<<"Price:"<<p.second.first<<"USD"<<std::endl;std::cout<<"AvailableQuantity:"<<p.second.second<<std::endl;return;}}std::cout<<"Productnotfound:"<<product<<std::endl;}private:std::vector<std::pair<std::string,std::pair<double,int>>products;};DECLARE_MODULE(ProductManagementModule);

最终的main函数会十分繁复:

#include"Module.h"intmain(){//失掉模块工厂实例module::ModuleFactory&factory=module::ModuleFactory::getFactory();//失掉购物车控制模块并口头autoshoppingCartModule=factory.getMultiModule<ShoppingCartModule>("ShoppingCartModule");shoppingCartModule->execute();//失掉用户注册模块并口头autouserRegistrationModule=factory.getMultiModule<UserRegistrationModule>("UserRegistrationModule");userRegistrationModule->execute();//失掉商品控制模块并口头autoproductManagementModule=factory.getMultiModule<ProductManagementModule>("ProductManagementModule");productManagementModule->execute();return0;}

论断

模块化编程是一种弱小的架构方法,它使得运行程序更容易保养、裁减和重用。经过经常使用模块类和模块工厂类,能够更好地控制和裁减运行程序的配置。模块化编程框架不只可以协助架构师构建可裁减的运行程序,还可以协助开发者编写更具模块性的代码,提高代码品质和可保养性。

本文只管繁难,但一个大型框架雷同也是由一招一式导致,小道至简,藏拙于巧。

参考

参考文献:[1]Gamma,E.,Helm,R.,Johnson,R.,&Vlissides,J.(1994).Designpatterns:elementsofreusableobject-orientedsoftware.PearsonEducation.

[2]Martin,R.C.(2003).Agilesoftwaredevelopment,principles,patterns,andpractices.PearsonEducation.

[3]Fowler,M.(2018).Refactoring:improvingthedesignofexistingcode.Addison-WesleyProfessional.


如何成为软件架构师

【原创回答】我本人是一名软件架构师,这个问题非常大,不太好回答。 我总结一下,软件架构师的能力大概分为三个方面:1.技术,这个应该没悬念,如果没有过硬的开发技术,就不要期望做架构师了;设计模式,系统模式,架构模型,系统理论,甚至编程语言,算法,操作系统,网络,数据库,都需要有扎实的掌握。 2.是业务知识,也即领域知识。 软件架构师实际上是把业务需求落实成开发蓝图的总设计师,如果你对业务一窍不通,空有一身技术也只能望业务兴叹。 3.就是沟通表达的能力,架构师需要推进自己的架构设计理念给开发团队,所以也需要这方面的能力,当然最重要的还是前两部分的能力。

什么是系统架构师-如何成为系统架构师

什么是系统架构师-如何成为系统架构师 系统架构师是在某一个技术领域有深刻专研的技术达人?还是在技术面上涉猎广泛的通才?抑或有个五六年的工作经验之后就自动变成了“架构师”?相信下面的文章对你的疑惑有所帮助! 新入门或没有架构设计经验的程序员刚开始的时候会有种不知所措的感觉,但其实架构设计是件很容易的事,它只是软件系统开发中的一个环节而已,整个软件系统的开发和维护以及变更还涉及到很多事情,包括技术、团队、沟通、市场、环境等等。 虽然架构设计是件容易的事情,但也不是大多数没有架构设计经验的程序员想象中的画画框图那么简单。 把几台服务器一摆,每一台服务器运行什么软件分配好,然后用网络连接起来,似乎每个企业级应用都是如此简间单单的几步。 但现实生活中的软件系统实实在在可以用复杂大系统来形容,从规划、开发、维护和变更涉及到许许多多的人和事。 架构设计就是要在规划阶段都把后面的事情尽量把握进来,要为稳定性努力,还要为可维护性、扩扩展性以及诸多的性能指标而思前想后。 除了技术上的考虑,还要考虑人的因素,包括人员的组织、软件过程的组织、团队的协作和沟通等。 另外,架构设计还需要方法论的指导。 这些方法论的思路包括,至上而下的分析,关注点分离,横向/纵向模块划分等。 有时候觉得架构设计决策就像是浏览Google Earth,实际上反映的是一种自上而下的决策过程。 对问题的分解是软件思维的基本素质,可以有横向分解、纵向分解以及两者的结合。 能不能有效快速准确的分解问题,是软件开发人员需要首先训练的项目。 另外,架构设计中图形化的工具非常有用,它能把系统的结构和运作机制以图形化的方式表达出来。 也正因为这样才有了架构设计就是画框图的误会。 再者,架构设计是一个工程性质的工作,对当事人的实际从业经验要求较高。 只有对市场上的各种技术有较全面的了解之后才有可能设计出一个尽可能满足各种设计约束的架构。 在架构师需要具备的能力上,架构师首先必须具有丰富的开发经验,是个技术主管。 因为他必须清楚什么是可以实现的,实现的方式有哪些,相应的难度怎么样,实现出来的系统面对需求变化的适应性等一系列指标。 另外,需要对面向过程、面向对象、面向服务等设计理念有深刻的理解,可以快速的察觉出实现中的问题并提出相应的改进(重构)方案(也就是通常说的反模式)。 这些都需要长期的开发实践才能真正的体会到,单从书本上很难领会到,就算当时理解了也不一定能融会到实践中去。 在技术能力上,软件架构师最重要也是最需要掌握的知识是构件通信机制方面的知识,包括进程内通信(对象访问、函数调用、数据交换、线程同步等)以及进程外(包括跨计算机)的通信(如RMI、DCOM、Web Service)。 在WEB应用大行其道的今天,开发者往往对服务器间的通信关注的比较多,而对进程内的通信较少关注。 进程外跨机器通信是构建分布式应用的基石,它是架构设计中的鸟瞰视图;而进程内的通信是模块实现的骨架,它是基石的基石。 如果具体到一个基于企业级架构设计,首先需要的是语言级别的认识,包括的CLR、继承特性、委托和事件处理等。 然后是常用解决方案的认识,包括 Web Service、 Remoting、企业服务组件等。 总之,丰富的开发实践经验有助于避免架构师纸上谈兵式的高来高去,给代码编写人员带来实实在在的可行性。 其次,具有足够的行业业务知识和商业头脑也是很重要的。 行业业务知识的足够把握可以给架构师更多的拥抱变化的能力,可以在系统设计的时候留出一些扩展的余地来适应可能来临的需求变化。 有经验的设计人员可能都碰到过这样的事,一厢情愿的保留接口在需求变化中的命中率非常低。 也就是说,在系统设计之初为扩展性留下来的系统接口没能在需求变化的洪流中发挥真正的作用,因为需求的变化并没有按照预想的方向进行,到最后还是不得不为变化的业务重新设计系统。 这就是因为对业务知识的理解和对市场或者商业的判断没有达到一个实用的、可以为架构扩展性服务的水平。 再次,架构设计师对人的关注必须提升到架构设计之初来纳入考虑的范围,包括沟通以及对人员素质的判断。 软件过程是团队协作共同构建系统的过程,沟通能力是将整个过程中多条开发线粘合在一起的胶水。 大家都应该碰到过事后说“原来是这样啊,我不知道啊”或者某个开发人员突然高声呼喊“为什么这里的数据没有了”之类的。 沟通的目的就是尽量避免多条开发线的混乱,让系统构建过程可以有条理的高效进行。 另外,对人的关注还表现在对团队成员的素质判断上,比如哪些开发人员对哪些技术更熟悉,或者哪些开发人员容易拖进度等。 只有合理的使用人力资源,让合适的人做合适的事情才能让整个软件过程更加高效。 另外,架构师应时刻注意新软件设计和开发方面的发展情况,并不断探索更有效的新方法、开发语言、设计模式和开发平台不断很快地升级,软件架构师需要吸收这些新技术新知识,并将它们用于软件系统开发工作中。 但对新技术的探索应该在一个理性的`范围内进行,不能盲目的跟风。 解决方案提供商永远都希望你能使用它提供的最新技术,而且它们在推广自己的解决方案的时候往往是以自己的产品为中心,容易给人错觉。 比如数据库,往往让人觉得它什么都能做,只要有了它其它什么都不重要了。 但事实上并不是如此,对于小型应用可以将许多业务逻辑用script的方式放入数据库中,但很少看到大型应用采用这样的做法。 对于新东西需要以一种比较的观点来判断,包括横向的比较和纵向的比较,最后得出一些性能、可移植性以及可升级等指标。 另外,新入行的开发人员往往关心新技术动向而忽略了技术的历史,而从DOS时代一路杀过来的开发者就对现在的技术体系有较全面的把握。 构架师不是通过理论学习可以搞出来的,不学习并且亲自实践相关知识肯定是不行的。 就像前面说到的,架构设计是一个工程性质的事情,只有在不断实践的基础上才能逐渐熟悉起来。 实践的内容并不是去深挖各种语言的特性,因为系统架构师是设计应用系统架构而不是设计语言(除非你是要实现DSL)。 更多的时候需要带着一种比较的眼光去实践,把不同的实现方式下的优缺点做个总结,做到自己心里有数,等具体的上下文环境下才好判断采用什么样的方式方法。 把基础打牢的同时掌握一定的方法,架构设计不是想象中的那么难。 ;

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 架构

“架构师之路-成为一名成功的软件架构师的综合指南 (架构师之路)” 的相关文章

实时的跨微服务数据访问-可信-微服务架构中的数据一致性-保障可靠 (跨服聊天微信例子)

实时的跨微服务数据访问-可信-微服务架构中的数据一致性-保障可靠 (跨服聊天微信例子)

引言 在微服务架构中,多个服务共同协作以执行原子操作。数据一致性是跨越多个服务执行分布式事务时面临的一项挑战。如果涉及分布式事务流程的某个参与者出现故障,可能会导致数据不一致,例如未下订单却向客...

微服务架构监控的原则 (微服务架构监控)

微服务架构监控的原则 (微服务架构监控)

微服务环境中的监控系统:变革与指导原则 引言 微服务架构的兴起彻底改变了软件开发,带来了速度和灵活性。随之而来,监控系统作为微服务控制系统的核心组成部分,也面临着全面的改造需求,以适应微服务环境...

哈啰云原生架构落地实践探索 (哈罗云起)

哈啰云原生架构落地实践探索 (哈罗云起)

全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择。 当时第一时间考虑用原生HPA组件,但在实际调研和小规模使用的时候发现了很多...

微服务架构中的不可或缺的服务治理工具-Eureka (微服务架构中如何处理服务间的通信)

微服务架构中的不可或缺的服务治理工具-Eureka (微服务架构中如何处理服务间的通信)

引言 Eureka是Netflix OSS(开源软件)项目的一部分,它是一个用于实现微服务架构中的服务注册和发现的开源工具。在当今庞大且复杂的微服务系统中,Eureka扮演着至关重要的角色,帮助...

CSaaS架构-开启数字孪生软件架构的新纪元 (csaas架构)

CSaaS架构-开启数字孪生软件架构的新纪元 (csaas架构)

简介 Browser/Server (BS) 和 Client/Server (CS) 是两种不同的软件架构模式,具有不同的特点和优缺点。本文将对这两种架构进行比较,并介绍山海鲸可视化的 C...

掌控复杂性-创造灵活可扩展的系统-六边形架构 (复杂事物掌控力)

掌控复杂性-创造灵活可扩展的系统-六边形架构 (复杂事物掌控力)

六边形架构是一种架构模式,将外部系统与核心应用程序分隔开来。它的思想很简单:从一个六边形开始,然后应用端口和适配器。 六边形架构的六个边 六边形有六个边,但六边形的形状本身并没有特别含...

六种最关键的架构模式 (六种最关键的职业)

六种最关键的架构模式 (六种最关键的职业)

架构模式:六种常见且关键的模式 引言 在软件开发中,架构模式是一种经过验证的解决方案,可以帮助解决常见的开发问题。这些模式提供了重用性的设计方案,允许开发人员创建可维护、可扩展和易于测试的应用程序...

架构中的低成本约束 (架构中的低成本是指)

架构中的低成本约束 (架构中的低成本是指)

低成本架构:创新与挑战的平衡 引言 在架构设计过程中,成本通常被视为一项重要约束或非功能目标。与高并发、高性能、高可用和安全性等其他非功能目标类似,低成本贯穿整个架构设计流程。本文探讨了实现低成...