大家好,反轉(zhuǎn)軟件組件之間的依賴關(guān)系之所以重要,是因為它有助于降低耦合度和提高模塊化程度,進而可以提高軟件的可維護性、可擴展性和可測試性。
當(dāng)組件之間緊密耦合時,對一個組件的更改可能會對其他組件產(chǎn)生意想不到的影響,從而導(dǎo)致整個系統(tǒng)中的連鎖更改效應(yīng)。通過反轉(zhuǎn)依賴關(guān)系,可以確保組件僅依賴于抽象而不是具體實現(xiàn)來減輕這個問題。
就ORM和模型類而言,反轉(zhuǎn)依賴關(guān)系允許ORM和模型類相互獨立地發(fā)展,有助于使代碼更加模塊化、更具可維護性。例如,如果數(shù)據(jù)庫模式發(fā)生更改,可以更新ORM以反映新的模式,而無需修改模型類。同樣,如果想切換到不同的ORM,我們也可以這樣做,而無需修改模型類。
此外,反轉(zhuǎn)依賴關(guān)系還允許對每個組件進行單獨測試,從而使代碼更具可測試性。例如,可以為模型類編寫單元測試,而無需設(shè)置數(shù)據(jù)庫連接,因為模型類并不依賴于ORM。同樣可以為ORM編寫集成測試,而無需實例化模型類,因為ORM僅依賴于模型類的抽象。
1.代碼示例
以下是一個使用Python中的SQLAlchemy反轉(zhuǎn)ORM和模型類之間依賴關(guān)系的示例。首先使用元數(shù)據(jù)定義模式,然后定義模型類,最后使用映射器和關(guān)系設(shè)置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
#?使用元數(shù)據(jù)定義模式
metadata?=?MetaData()
class?UserTable:
????@declared_attr
????def?__tablename__(cls):
????????return?cls.__name__.lower()?+?'s'
????id?=?Column(Integer,?primary_key=True)
????name?=?Column(String)
????email?=?Column(String,?unique=True)
class?PostTable:
????@declared_attr
????def?__tablename__(cls):
????????return?cls.__name__.lower()?+?'s'
????id?=?Column(Integer,?primary_key=True)
????title?=?Column(String)
????content?=?Column(String)
????user_id?=?Column(Integer,?ForeignKey('users.id'))
#?定義模型類
class?User:
????def?__init__(self,?name,?email):
????????self.name?=?name
????????self.email?=?email
class?Post:
????def?__init__(self,?title,?content,?author):
????????self.title?=?title
????????self.content?=?content
????????self.author?=?author
#?使用映射器和關(guān)系設(shè)置ORM
engine?=?create_engine('sqlite:///example.db')
Session?=?sessionmaker(bind=engine)
Base?=?declarative_base()
class?UserORM(Base,?UserTable):
????@property
????def?model(self):
????????return?User(self.name,?self.email)
class?PostORM(Base,?PostTable):
????@property
????def?model(self):
????????return?Post(self.title,?self.content,?self.author.model)
????author?=?relationship(UserORM,?backref='posts')
Base.metadata.create_all(engine)
#?在應(yīng)用程序中使用ORM和模型類
session?=?Session()
#?創(chuàng)建一些用戶和帖子
user1?=?UserORM(name='Alice',?email='alice@example.com')
user2?=?UserORM(name='Bob',?email='bob@example.com')
post1?=?PostORM(title='My?first?post',?content='Hello,?world!',?author=user1)
post2?=?PostORM(title='Another?post',?content='This?is?a?test',?author=user2)
#?將用戶和帖子保存到數(shù)據(jù)庫
session.add(user1)
session.add(user2)
session.add(post1)
session.add(post2)
session.commit()
#?通過電子郵件地址檢索用戶
user?=?session.query(UserORM).filter_by(email='alice@example.com').one()
print(user.model.name)??#?打印出?"Alice"
#?檢索用戶的帖子
for?post?in?user.posts:
????print(post.model.title)??#?打印出?"My?first?post"
在這段代碼中,首先使用元數(shù)據(jù)定義了模式,并為數(shù)據(jù)庫中的每個表定義了單獨的類。然后定義模型類User
和Post
,它們與相應(yīng)的數(shù)據(jù)庫表具有相同的屬性。
接下來,使用映射器將模型類映射到數(shù)據(jù)庫表,還定義了User
模型和Post
模型之間的關(guān)系,其中User
模型具有一個posts
屬性,該屬性是用戶的帖子列表。
最后,在應(yīng)用程序中使用ORM和模型類,創(chuàng)建一些用戶和帖子,并將它們保存到數(shù)據(jù)庫中。然后,通過電子郵件地址檢索用戶并打印他們的姓名,以及檢索用戶的帖子并打印它們的標(biāo)題。
通過以這種方式反轉(zhuǎn)ORM和模型類之間的依賴關(guān)系,使代碼更加解耦且易于維護。我們可以更改數(shù)據(jù)庫模式或ORM實現(xiàn)而不必修改模型類,反之亦然,這使得輕松測試模型類,而無需設(shè)置數(shù)據(jù)庫連接。
此外,通過在ORM類中使用model
屬性來返回相應(yīng)模型類的實例,進一步反轉(zhuǎn)了依賴關(guān)系,因為現(xiàn)在ORM類依賴于模型類,而不是相反。
通過使用元數(shù)據(jù)定義模式、定義模型類并使用映射器和關(guān)系來設(shè)置ORM,可以實現(xiàn)ORM和模型類之間的依賴關(guān)系反轉(zhuǎn)。通過這種方法,可以使代碼更加解耦且易于維護。
2.反轉(zhuǎn)依賴關(guān)系
在上面的代碼中,通過以下方式實現(xiàn)了ORM和模型類之間的依賴關(guān)系反轉(zhuǎn):
-
使用元數(shù)據(jù)定義數(shù)據(jù)庫模式:創(chuàng)建了一個
metadata
對象,并使用它來使用SQLAlchemy的表結(jié)構(gòu)定義數(shù)據(jù)庫模式。 -
定義模型類:定義了
User
和Post
模型類,它們代表了系統(tǒng)中的實體,并定義這些實體的屬性和行為。 -
使用映射器和關(guān)系設(shè)置ORM:使用SQLAlchemy的
mapper
函數(shù)將ORM類映射到第1步中定義的數(shù)據(jù)庫模式。還使用SQLAlchemy的relationship
函數(shù)定義ORM類之間的關(guān)系,例如User
和Post
之間的一對多關(guān)系。文章來源:http://www.zghlxwxcb.cn/news/detail-790528.html
通過這樣做,將ORM類與數(shù)據(jù)庫模式和模型類解耦,并使其依賴于SQLAlchemy提供的抽象,例如元數(shù)據(jù)和映射器函數(shù)。這使得修改數(shù)據(jù)庫模式或切換到不同的ORM實現(xiàn)變得更容易,而無需修改模型類。它還使模型類更容易進行測試,因為可以在不需要實例化ORM類或連接到數(shù)據(jù)庫的情況下對其進行隔離測試。文章來源地址http://www.zghlxwxcb.cn/news/detail-790528.html
到了這里,關(guān)于掌握Python設(shè)計模式,SQL Alchemy打破ORM與模型類的束縛的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!