当前位置: 首页 > 后端技术 > Python

编程范式

时间:2023-03-26 16:42:47 Python

新手必须注意的编程语言与成百上千的编程语言(ProgrammingLanguages)相比,编程范式(ProgrammingParadigm,范式)要少得多。如图所示,有27个范例。大多数范式仅在一个或几个概念上有所不同。存在三种最常用的范例:过程编程、面向对象编程(OOP)和函数式编程(FP)。然后我们介绍新兴的第四范式,即面向方面编程(AOP)。过程式编程过程式编程的核心是模块化。实现过程中使用状态,依赖外部变量,容易影响附近的代码,导致可读性低,后期维护成本高。.过程式编程经历了两个发展阶段,从非结构化到结构化:非结构化编程:机器语言和汇编语言的编程范式被认为是非结构化编程,没有封装函数的概念,在代码中满是goto语句的状态天空。结构化编程:抽象了机器的行为,屏蔽了计算机的一些硬件细节。代表语言是我们常用的C语言。有时结构化编程也称为过程式编程,或面向过程的编程。defget_shannon_info(output):"""获取shannon类闪存卡信息"""defcheck_health():time_left=float(sub_info["life_left"])iftime_leftDISK_ALARM_TEMPERATURE:message="temperatureisoverthan{}C".format(DISK_ALARM_TEMPERATURE)returnmessagereturn"healthy"http://tags.astro.sina.com.cn...result={}all_info=_get_shannon_info(output)forinfoinall_info:sub_info={}sub_info["available_capacity"]=info.get("disk_capacity","")sub_info["device_name"]=info.get("block_device_node","")sub_info["firmware_version"]=info.get("firmware_version","")sub_info["interface"]="PCIe"sub_info["life_left"]=str(info.get("estimated_life_left","").replace("%",""))sub_info["pcie_id"]=info.get("pci_deviceid","")sub_info["pcie_length"]=""sub_info["pcie_type"]=""sub_info["physical_read"]=info.get("host_read_data","")sub_info["physical_write"]=info.get("total_write_data","")sub_info["serial_number"]=info.get("serial_number")sub_info["temperature"]=info.get("controller_temperature")sub_info["type"]=info["type"]sub_info["error_msg"]=check_health()sub_info["status"]="ok"ifsub_info["error_msg"]=="healthy"else"error"ifsub_info["serial_number"]:result[sub_info["serial_number"]]=sub_infoelse:result[sub_info["device_name"]]=sub_inforeturnresult状态特性降低代码耦合,提高系统可维护性。C++及后来的Java成为主流。人们开始将领域问题映射为实体和关系(程序=实体+关系)而不是数据结构和算法(过程),这就是面向对象编程,核心特点是封装、继承和多态。1classIFlash(six.with_metaclass(abc.ABCMeta)):def__init__(self):pass@abc.abstractmethoddefcollect(self):"""收集flash卡物理信息"""passclassFlashShannon(IFlash):""宝保存的Flash卡"""def__init__(self,txt_path,command,printer):super(FlashShannon,self).__init__()self.txt_path=txt_pathself.command=commandself.printer=printerdefcollect(self):结果={}获取self._get_shannon_info()中的信息:life_left=str(info.get("estimated_life_left","")).replace("%","")temperature=info.get("controller_temperature","")error_msg=self._get_health_message(life_left,temperature)sub_info={"available_capacity":info.get("disk_capacity",""),"device_name":info.get("block_device_node",""),"firmware_version":info.get("firmware_version",""),"interface":"PCIe","life_left":life_left,"pcie_id":info.get("pci_deviceid",""),"pcie_length":"","pcie_type":"","physical_read":info.get("host_read_data",""),"physical_write":info.get("total_write_data",""),"serial_number":info.get("serial_number",""),"temperature":温度,"type":info["type"],"error_msg":error_msg,"status":"ok"iferror_msg=="healthy"else"error"}ifsub_info["serial_number"]:result[sub_info["serial_number"]]=sub_infoelse:result[sub_info["device_name"]]=sub_inforeturnresulthttp://tags.astro.sina.com.cn...classFlashFio(IFlash):"""fio的Flash卡"""def__init__(self,txt_path):super(FlashFio,self).__init__()self.txt_path=txt_pathdefcollect(self):disk_info={}adapter_info=self._get_adapter_info()forinfoinadapter_info:serial_number=info["fio_serial_number"]forioininfo["iomemory"]:data=self._combining_io_memory(io)data["serial_number"]=serial_numberdisk_info[serial_number]=datareturndisk_info函数式编程函数式编程(FunctionalProgramming)的核心是“避免副作用”,不改变也不依赖当前函数不可变数据和作为一等公民的函数的结合使得函数具有自描述性和高度可读性。首先,函数式编程的主要理论基础是Lambda演算,是图灵完备的;其次,函数式编程是抽象的代数思维,更接近现代自然科学,用形式化的方式来解释世界,制定推演世界,极其抽象(比如F=ma)。在这条路上,很多人都偏向于学院风。他们关注的是解决方案是否优雅,以及如何层层抽象。他们也探索了更多的可能性,垃圾回收机制是最先从这里冒出来的。1@pytest.mark.parametrize("line,result",[("FoundShannonPCIE",False),("FoundShannonPCIEFlashcar",False),("FoundShannonPCIEFlashcarda",True),(“找到香农PCIE闪存卡”,真),(“找到香农PCIE闪存卡。”,真),])deftest_is_shannon_flash_device(线,结果):断言功能。is_shannon_flash_device(线)==result@pytest.mark。parametrize("line,result",[("a=1",True),("b=2",True),("c=2333",True),("dx=abcde",True),("找到香农PCIE=1",真),("abcdedfew=",假),("找到香农PCIE",假),("=找到香农PCIE",假),("=找到香农PCIE",假),("FoundShannonPCIE=",False),("FoundShannonPCIE=",False),])http://tags.astro.sina.com.cn...deftest_is_effective_value(line,result):断言functional.is_effective_value(line)==result@pytest.mark.parametrize("line,result",[("a=1",{"a":"1"}),("b=2",{"b":"2"}),("a=a",{"a":"a"}),("abc=a",{"abc":"a"}),("abc=abcde",{"abc":"abcde"}),])deftest_gets_the_index_name_and_value(line,result):assertfunctional.gets_the_index_name_and_value(line)==result@pytest.mark.parametrize("output,filter_func,result",[("abcd\nbcd\nabcd\nbcd\naa\naa",lambdax:"a"inx,["abcd\nbcd","abcd\nbcd","aa","aa"]),(open(os.path.join(project_path,"fixtures","shannon-status.txt")).read(),functional.is_shannon_flash_device,[open(os.path.join(project_path,"fixtures","shannon-sctb.txt")).read(),open(os.path.join(project_path,"fixtures","shannon-scta.txt")).read()])http://tags.astro.sina.com.cn...])deftest_checks_string_split_by_function(output,filter_func,result):assertfunctional.checks_string_split_by_function(output,filter_func)==result面向切面编程(AspectOrientedProgramming,AOP)为开发者提供了描述和描述横切关注点的机制,可以主动将横切关注点编织到面向对象的软件系统中实现横切关注点的模块化。AOP可以组合与业务无关但通常由业务模块调用的逻辑或职责。如事务处理、日志管理、权限控制等。封装便于减少系统的重复代码,降低模块之间的耦合度,有利于日后的可操作性和可维护性。Python可以使用装饰器实现AOP。1三种主要范式的比较领域驱动设计不难看出,编程语言的发展是一个逐渐远离计算机硬件,向所要解决的领域问题靠拢的过程。因此,编程语言后续的发展方向就是探索如何更好地解决领域问题,即领域驱动设计(Domain-drivenDesign,DDD)。DDD的本质是边界的划分和控制。有四个边界:1.第一个边界是在问题空间中划分子域,包括核心域、支持域和通用域。2、第二个边界是在解空间中拆分BC(BoundedContext,有界上下文),BC之间的协作关系通过上下文映射(ContextMapping)来表达。3.第三个边界是将BC内部的业务复杂性和技术复杂性分离,形成分层架构,包括用户界面层、应用层、领域层和基础设施层。4.第四个边界是在领域层引入聚合这个最小的设计单元。它从完整性和一致性的角度有效地隔离了领域模型。聚合包括实体、值对象、领域服务、工厂和仓库等设计元素。设计原则和模式设计原则有很多,程序员最常用的是SOLID原则,这是一套比较系统的设计原则。它不仅可以指导我们设计模块(类),还可以作为衡量我们设计有效性的一把尺子。SOLID原则是五个设计原则的首字母缩写,它们是:单一职责原则(Singleresponsibilityprinciple,SRP):一个类应该有一个且只有一个变化的原因。开闭原则(OCP):软件实体(类、模块、函数)应该对扩展开放,对修改关闭。里氏替换原则(LSP):子类型必须能够替换其基类型。接口隔离原则(ISP):不应该强迫用户依赖他们不使用的方法。依赖倒置原则(DIP):高层模块不应该依赖低层模块,两者都应该依赖抽象;抽象不应该依赖于细节,细节应该依赖于抽象。前面我们提到,对于面向对象来说,核心是多态设计。看看SOLID原则是如何指导多态设计的:单一职责原则:通过接口把变化和不变的分开,隔离变化。开闭原则:多态的目标是扩展系统的变化而不是修改。里氏替换原则:界面设计要达到隐藏细节的完美效果。接口隔离原则:不同客户的接口要隔离。依赖倒置原则:接口的设计者和说明者应该是使用接口的方法。除了设计原则,我们还需要掌握常用的设计模式。设计模式是针对一些常见问题的具体解决方案,使面向对象的设计更加灵活优雅,从而具有更好的可重用性。学习设计模式不仅仅是学习如何写代码,更重要的是了解模式的应用场景。不管是哪种设计模式,其背后都隐藏着一些“永恒不变的真理”,而这个真理就是设计原则。事实上,还有什么比原则更重要呢?就像一个人的世界观和人生观一样,那是支配你一切行为的根本。可以说设计原则是设计模式的灵魂。手破里是一种循序渐进的武术学习方法:第一步——手,遵循规则,直到完全理解并成为习惯。第二步——打破,反思规则,寻找规则的例外,“打破”规则。第三步——离开,掌握了规则之后,你就基本脱离了规则,掌握了它的本质和深层能量。设计模式的学习也是一个保持和打破的过程:第一步——保持,在设计和应用中模仿已有的设计模式,学会在模仿中思考。第二步——打破,在熟练使用基本设计模式后,创造新的设计模式。第三步——离开,忘记所有的设计模式,在设计中巧妙地运用它们。————————————————