最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

如何解決python的feature envy

2023-04-17 21:24 作者:bibnoifasdfadf  | 我要投稿

在編寫Python代碼時,有時會出現(xiàn)一個問題,即一個對象對另一個對象的數(shù)據(jù)過于依賴,而不是依賴自己的數(shù)據(jù)。這種問題被稱為Feature Envy。這種問題可能會導致代碼的可維護性變得困難,并使代碼更加復雜。以下是一些解決Feature Envy的方法,幫助您在Python中編寫更好的代碼。

?1. 將代碼移到正確的位置

?當一個對象依賴于另一個對象的數(shù)據(jù)時,我們可以考慮將代碼移到正確的位置。例如,我們可以將這個代碼放到要使用這些數(shù)據(jù)的對象中,而不是在另一個對象中。這種方法可以使代碼更加清晰,并使代碼更易于維護和擴展。

?例如,下面是一個示例代碼片段,它違反了Feature Envy原則:

class Customer:

? ? def __init__(self, name, address):

? ? ? ? self.name = name

? ? ? ? self.address = address

? ? ? ? self.orders = []

? ? ?def print_orders(self):

? ? ? ? for order in self.orders:

? ? ? ? ? ? print(order.get_order_details())

在這個代碼中,Customer對象依賴于Order對象的數(shù)據(jù)。為了解決這個問題,我們可以將print_orders方法移到Order對象中:

class Customer:

? ? def __init__(self, name, address):

? ? ? ? self.name = name

? ? ? ? self.address = address

? ? ? ? self.orders = []

?class Order:

? ? def __init__(self, customer):

? ? ? ? self.customer = customer

? ? ? ? self.order_details = []

? ? ?def get_order_details(self):

? ? ? ? return self.order_details

?class OrderPrinter:

? ? def __init__(self, order):

? ? ? ? self.order = order

? ? ?def print_orders(self):

? ? ? ? print(self.order.get_order_details())

在這個重新設計的代碼中,Customer對象不再依賴于Order對象的數(shù)據(jù),而是通過OrderPrinter對象獲取數(shù)據(jù)并打印。

?2. 將方法移到正確的對象中

?在某些情況下,我們可以將方法移到正確的對象中,從而避免Feature Envy。例如,我們可以將依賴于另一個對象的方法移到另一個對象中。

?例如,下面是一個示例代碼片段,它違反了Feature Envy原則:

class Customer:

? ? def __init__(self, name, address):

? ? ? ? self.name = name

? ? ? ? self.address = address

? ? ? ? self.orders = []

? ? ?def print_customer_details(self):

? ? ? ? print("Name: {0}, Address: {1}".format(self.name, self.address))

? ? ? ? for order in self.orders:

? ? ? ? ? ? print("\tOrder Details: {0}".format(order.get_order_details()))

在這個代碼中,print_customer_details方法依賴于Order對象的數(shù)據(jù)。為了解決這個問題,我們可以將get_order_details方法移到Order對象中,并由Order對象返回包含其數(shù)據(jù)的字符串。然后,我們可以將print_customer_details方法移到Customer對象中,并使用Order對象的新方法打印輸出。

class Customer:

? ? def __init__(self, name, address):

? ? ? ? self.name = name

? ? ? ? self.address = address

? ? ? ? self.orders = []

? ? ?def print_customer_details(self):

? ? ? ? print("Name: {0}, Address: {1}".format(self.name, self.address))

? ? ? ? for order in self.orders:

? ? ? ? ? ? print("\tOrder Details: {0}".format(order.get_order_details_string()))

?class Order:

? ? def __init__(self, customer):

? ? ? ? self.customer = customer

? ? ? ? self.order_details = []

? ? ?def get_order_details_string(self):

? ? ? ? return "\tProduct: {0}, Quantity: {1}".format(self.order_details.product, self.order_details.quantity)

在這個重新設計的代碼中,print_customer_details方法不再依賴于Order對象的數(shù)據(jù),而是使用Order對象的新方法打印輸出。

?3. 使用中介對象

?在某些情況下,我們可以使用中介對象來避免Feature Envy。中介對象是一個作為兩個對象之間的接口的對象。中介對象可以控制兩個對象之間的通信,并降低它們之間的依賴。

?例如,下面是一個示例代碼片段,它違反了Feature Envy原則:

class Customer:

? ? def __init__(self, name, address):

? ? ? ? self.name = name

? ? ? ? self.address = address

? ? ? ? self.orders = []

? ? ?def print_order_summary(self):

? ? ? ? for order in self.orders:

? ? ? ? ? ? print("Product: {0}, Quantity: {1}".format(order.product, order.quantity))

?class Order:

? ? def __init__(self, customer, product, quantity):

? ? ? ? self.customer = customer

? ? ? ? self.product = product

? ? ? ? self.quantity = quantity

在這個代碼中,Customer對象依賴于Order對象的數(shù)據(jù)。為了解決這個問題,我們可以創(chuàng)建一個中介對象,即OrderSummary對象:

class Customer:

? ? def __init__(self, name, address):

? ? ? ? self.name = name

? ? ? ? self.address = address

? ? ? ? self.orders = []

? ? ?def print_order_summary(self):

? ? ? ? order_summary = OrderSummary(self.orders)

? ? ? ? order_summary.print_summary()

?class Order:

? ? def __init__(self, customer, product, quantity):

? ? ? ? self.customer = customer

? ? ? ? self.product = product

? ? ? ? self.quantity = quantity

?class OrderSummary:

? ? def __init__(self, orders):

? ? ? ? self.orders = orders

? ? ? ? self.summary = []

? ? ?def print_summary(self):

? ? ? ? for order in self.orders:

? ? ? ? ? ? summary_item = "Product: {0}, Quantity: {1}".format(order.product, order.quantity)

? ? ? ? ? ? self.summary.append(summary_item)

? ? ? ? print(self.summary)

在這個重新設計的代碼中,Customer對象不再依賴于Order對象的數(shù)據(jù),而是使用OrderSummary對象來獲取和打印輸出。

?綜上所述,解決Feature Envy問題可以提高代碼的可維護性和可讀性。通過將代碼移到正確的位置、將方法移到正確的對象中、使用中介對象等技術,我們可以避免對象之間的大量依賴,并使代碼更易于維護和擴展。


如何解決python的feature envy的評論 (共 條)

分享到微博請遵守國家法律
漳浦县| 方正县| 塔城市| 沐川县| 福海县| 昌平区| 安新县| 罗山县| 青冈县| 鹰潭市| 无为县| 彭泽县| 邵武市| 福清市| 桐乡市| 黑山县| 郁南县| 桂东县| 当阳市| 无为县| 巴青县| 旅游| 翼城县| 河南省| 司法| 将乐县| 台东市| 思南县| 五家渠市| 台前县| 兴安盟| 庆元县| 华亭县| 宁乡县| 吉安县| 景宁| 黄冈市| 香港 | 宝鸡市| 安吉县| 东乡族自治县|