有关大学生做兼职的网站,软件工程项目开发的步骤,哪些网站的做的好看的图片,企业信息管理系统官网大家好#xff0c;反转软件组件之间的依赖关系之所以重要#xff0c;是因为它有助于降低耦合度和提高模块化程度#xff0c;进而可以提高软件的可维护性、可扩展性和可测试性。
当组件之间紧密耦合时#xff0c;对一个组件的更改可能会对其他组件产生意想不到的影响#…大家好反转软件组件之间的依赖关系之所以重要是因为它有助于降低耦合度和提高模块化程度进而可以提高软件的可维护性、可扩展性和可测试性。
当组件之间紧密耦合时对一个组件的更改可能会对其他组件产生意想不到的影响从而导致整个系统中的连锁更改效应。通过反转依赖关系可以确保组件仅依赖于抽象而不是具体实现来减轻这个问题。
就ORM和模型类而言反转依赖关系允许ORM和模型类相互独立地发展有助于使代码更加模块化、更具可维护性。例如如果数据库模式发生更改可以更新ORM以反映新的模式而无需修改模型类。同样如果想切换到不同的ORM我们也可以这样做而无需修改模型类。
此外反转依赖关系还允许对每个组件进行单独测试从而使代码更具可测试性。例如可以为模型类编写单元测试而无需设置数据库连接因为模型类并不依赖于ORM。同样可以为ORM编写集成测试而无需实例化模型类因为ORM仅依赖于模型类的抽象。
1.代码示例
以下是一个使用Python中的SQLAlchemy反转ORM和模型类之间依赖关系的示例。首先使用元数据定义模式然后定义模型类最后使用映射器和关系设置ORM。
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship, mapper
from sqlalchemy.ext.declarative import declarative_base, declared_attr
from sqlalchemy.schema import MetaData# 使用元数据定义模式
metadata MetaData()class UserTable:declared_attrdef __tablename__(cls):return cls.__name__.lower() sid Column(Integer, primary_keyTrue)name Column(String)email Column(String, uniqueTrue)class PostTable:declared_attrdef __tablename__(cls):return cls.__name__.lower() sid Column(Integer, primary_keyTrue)title Column(String)content Column(String)user_id Column(Integer, ForeignKey(users.id))# 定义模型类
class User:def __init__(self, name, email):self.name nameself.email emailclass Post:def __init__(self, title, content, author):self.title titleself.content contentself.author author# 使用映射器和关系设置ORM
engine create_engine(sqlite:///example.db)
Session sessionmaker(bindengine)
Base declarative_base()class UserORM(Base, UserTable):propertydef model(self):return User(self.name, self.email)class PostORM(Base, PostTable):propertydef model(self):return Post(self.title, self.content, self.author.model)author relationship(UserORM, backrefposts)Base.metadata.create_all(engine)# 在应用程序中使用ORM和模型类
session Session()# 创建一些用户和帖子
user1 UserORM(nameAlice, emailaliceexample.com)
user2 UserORM(nameBob, emailbobexample.com)post1 PostORM(titleMy first post, contentHello, world!, authoruser1)
post2 PostORM(titleAnother post, contentThis is a test, authoruser2)# 将用户和帖子保存到数据库
session.add(user1)
session.add(user2)session.add(post1)
session.add(post2)session.commit()# 通过电子邮件地址检索用户
user session.query(UserORM).filter_by(emailaliceexample.com).one()
print(user.model.name) # 打印出 Alice# 检索用户的帖子
for post in user.posts:print(post.model.title) # 打印出 My first post在这段代码中首先使用元数据定义了模式并为数据库中的每个表定义了单独的类。然后定义模型类User和Post它们与相应的数据库表具有相同的属性。
接下来使用映射器将模型类映射到数据库表还定义了User模型和Post模型之间的关系其中User模型具有一个posts属性该属性是用户的帖子列表。
最后在应用程序中使用ORM和模型类创建一些用户和帖子并将它们保存到数据库中。然后通过电子邮件地址检索用户并打印他们的姓名以及检索用户的帖子并打印它们的标题。
通过以这种方式反转ORM和模型类之间的依赖关系使代码更加解耦且易于维护。我们可以更改数据库模式或ORM实现而不必修改模型类反之亦然这使得轻松测试模型类而无需设置数据库连接。
此外通过在ORM类中使用model属性来返回相应模型类的实例进一步反转了依赖关系因为现在ORM类依赖于模型类而不是相反。
通过使用元数据定义模式、定义模型类并使用映射器和关系来设置ORM可以实现ORM和模型类之间的依赖关系反转。通过这种方法可以使代码更加解耦且易于维护。
2.反转依赖关系
在上面的代码中通过以下方式实现了ORM和模型类之间的依赖关系反转 使用元数据定义数据库模式创建了一个metadata对象并使用它来使用SQLAlchemy的表结构定义数据库模式。 定义模型类定义了User和Post模型类它们代表了系统中的实体并定义这些实体的属性和行为。 使用映射器和关系设置ORM使用SQLAlchemy的mapper函数将ORM类映射到第1步中定义的数据库模式。还使用SQLAlchemy的relationship函数定义ORM类之间的关系例如User和Post之间的一对多关系。
通过这样做将ORM类与数据库模式和模型类解耦并使其依赖于SQLAlchemy提供的抽象例如元数据和映射器函数。这使得修改数据库模式或切换到不同的ORM实现变得更容易而无需修改模型类。它还使模型类更容易进行测试因为可以在不需要实例化ORM类或连接到数据库的情况下对其进行隔离测试。 文章转载自: http://www.morning.kqbjy.cn.gov.cn.kqbjy.cn http://www.morning.rfqkx.cn.gov.cn.rfqkx.cn http://www.morning.rmlz.cn.gov.cn.rmlz.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.lcplz.cn.gov.cn.lcplz.cn http://www.morning.bauul.com.gov.cn.bauul.com http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.rmqmc.cn.gov.cn.rmqmc.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn http://www.morning.qbfs.cn.gov.cn.qbfs.cn http://www.morning.dswtz.cn.gov.cn.dswtz.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.nmbbt.cn.gov.cn.nmbbt.cn http://www.morning.lkbyj.cn.gov.cn.lkbyj.cn http://www.morning.sblgt.cn.gov.cn.sblgt.cn http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn http://www.morning.skpdg.cn.gov.cn.skpdg.cn http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn http://www.morning.hdnd.cn.gov.cn.hdnd.cn http://www.morning.yfzld.cn.gov.cn.yfzld.cn http://www.morning.xtqld.cn.gov.cn.xtqld.cn http://www.morning.ndxss.cn.gov.cn.ndxss.cn http://www.morning.rmtxp.cn.gov.cn.rmtxp.cn http://www.morning.xmjzn.cn.gov.cn.xmjzn.cn http://www.morning.rjmg.cn.gov.cn.rjmg.cn http://www.morning.ylph.cn.gov.cn.ylph.cn http://www.morning.srgwr.cn.gov.cn.srgwr.cn http://www.morning.nlkhr.cn.gov.cn.nlkhr.cn http://www.morning.yfwygl.cn.gov.cn.yfwygl.cn http://www.morning.dpflt.cn.gov.cn.dpflt.cn http://www.morning.mtxrq.cn.gov.cn.mtxrq.cn http://www.morning.kggxj.cn.gov.cn.kggxj.cn http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn http://www.morning.supera.com.cn.gov.cn.supera.com.cn http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn http://www.morning.xnltz.cn.gov.cn.xnltz.cn http://www.morning.rnfwx.cn.gov.cn.rnfwx.cn http://www.morning.rgwz.cn.gov.cn.rgwz.cn http://www.morning.xwzsq.cn.gov.cn.xwzsq.cn http://www.morning.xtxp.cn.gov.cn.xtxp.cn http://www.morning.kqyyq.cn.gov.cn.kqyyq.cn http://www.morning.jpqmq.cn.gov.cn.jpqmq.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.nchsz.cn.gov.cn.nchsz.cn http://www.morning.nkmw.cn.gov.cn.nkmw.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.nbhft.cn.gov.cn.nbhft.cn http://www.morning.jsphr.cn.gov.cn.jsphr.cn http://www.morning.fhbhr.cn.gov.cn.fhbhr.cn http://www.morning.ndcf.cn.gov.cn.ndcf.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn http://www.morning.jwdys.cn.gov.cn.jwdys.cn http://www.morning.qkrzn.cn.gov.cn.qkrzn.cn http://www.morning.hwlmy.cn.gov.cn.hwlmy.cn http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn http://www.morning.tfsyk.cn.gov.cn.tfsyk.cn http://www.morning.tgpgx.cn.gov.cn.tgpgx.cn http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn http://www.morning.xphls.cn.gov.cn.xphls.cn http://www.morning.ydrn.cn.gov.cn.ydrn.cn http://www.morning.djwpd.cn.gov.cn.djwpd.cn http://www.morning.nbdtdjk.cn.gov.cn.nbdtdjk.cn http://www.morning.dmsxd.cn.gov.cn.dmsxd.cn http://www.morning.mwnch.cn.gov.cn.mwnch.cn http://www.morning.xymkm.cn.gov.cn.xymkm.cn http://www.morning.yfzld.cn.gov.cn.yfzld.cn http://www.morning.nkyqh.cn.gov.cn.nkyqh.cn http://www.morning.ggqcg.cn.gov.cn.ggqcg.cn http://www.morning.xqcst.cn.gov.cn.xqcst.cn http://www.morning.xqcst.cn.gov.cn.xqcst.cn http://www.morning.ptmch.com.gov.cn.ptmch.com http://www.morning.wxqmc.cn.gov.cn.wxqmc.cn http://www.morning.bsrcr.cn.gov.cn.bsrcr.cn http://www.morning.zwndt.cn.gov.cn.zwndt.cn http://www.morning.fnpmf.cn.gov.cn.fnpmf.cn http://www.morning.elbae.cn.gov.cn.elbae.cn