国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(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的評論 (共 條)

分享到微博請遵守國家法律
文化| 资源县| 毕节市| 天水市| 长汀县| 渭源县| 德阳市| 商水县| 克山县| 桐乡市| 曲松县| 建瓯市| 通化市| 汉寿县| 织金县| 太白县| 齐河县| 茌平县| 壤塘县| 林甸县| 海阳市| 商城县| 西和县| 阿尔山市| 阳江市| 保靖县| 祁东县| 永胜县| 南涧| 金沙县| 弥渡县| 苏尼特右旗| 丹东市| 澄迈县| 乌鲁木齐市| 石狮市| 都江堰市| 鹿泉市| 额济纳旗| 迁西县| 蚌埠市|