gpt4 book ai didi

python - 针对集合的 CRUD 操作的单一职责原则

转载 作者:行者123 更新时间:2023-11-28 22:49:10 25 4
gpt4 key购买 nike

我试图了解如何在逻辑上分离 CRUD 职责,以遵守单一职责原则 (SRP)。

根据我对 SRP 定义的理解,单一职责不一定是单一行为,而是与其他行为具有明确定义的逻辑边界的行为集合。

在我的示例中,RestaurantMenu 只不过是一个集合。我知道有更有效的方法来表示这一点,例如使用字典,但这超出了本示例的意图。我的 RestaurantMenu 没有分配给它的行为,因为我仍然不清楚定义任何进一步的行为是否会违反 SRP。通过 Manager 对象而不是通过 RestaurantMenu 中的方法实例化和调用单独的 CRUD 对象感觉相当不舒服,所以这就是为什么我决定在这里向观众寻求一些指导。

以下示例是否通过了 SRP 石蕊测试?

class RestaurantMenu(object):                                                   

def __init__(self, title, creator, catalog_type, restaurant):
self._title = title
self._creator = creator
self._catalog_type = catalog_type
self._restaurant = restaurant
self._menuitems = dict()


class MenuManager(object):
"""Responsibility
--------------
Coordinates CRUD related activities with a menu
"""

def __init__(self, menu):
self._menu = menu

def add_menu_item(self, item, value):
menu_item_adder = AddMenuItem(self._menu)
menu_item_adder(item, value)

def del_menu_item(self, item):
menu_item_deleter = DelMenuItem(self._menu)
menu_item_deleter(item)

def update_menu_item(self, existing_item, new_info):
menu_item_updater = UpdateMenuItem(self._menu)
menu_item_updater(existing_item, new_info)

def get_menu_items(self):
menu_item_getter = GetMenuItems(self._menu)
menu_item_getter()

class GetMenuItems(object):

def __init__(self, menu):
self._menu = menu

def __call__(self):
print(self._menu._title)
print('='*len(self._menu._title))
for key, value in self._menu._menuitems.items():
print(key, value)


class AddMenuItem(object):

def __init__(self, menu):
self._menu = menu

def __call__(self, item, value):
if item not in self._menu._menuitems:
self._menu._menuitems[item] = value
print('Item added:', item)
else:
print('Item already exists. Please update instead.')


class DelMenuItem(object):

def __init__(self, menu):
self._menu = menu

def __call__(self, item):
popped = self._menu._menuitems.pop(item)
print('Item removed:', popped)


class UpdateMenuItem(object):

def __init__(self, menu):
self._menu = menu

def __call__(self, existing_item, new_info):
self._menu._menuitems.update(existing_item=new_info)
print('Item updated:', existing_item, ' with', new_info)


def main():

mymenu = RestaurantMenu("Joe's Crab Shack 2014 Menu",
"Joe Schmoe",
"Restaurant",
"Joe's Crab Shack")

menumanager = MenuManager(mymenu)

menumanager.add_menu_item('longneck_clams', 7.00)
menumanager.add_menu_item('1 pound lobster', 15.00)
menumanager.add_menu_item('lobster chowder', 9.00)

print('-'*50)
menumanager.get_menu_items()


if __name__ == "__main__":
main()

最佳答案

SRP 合规性的一个可能定义是应该只有 one reason for a class to change .

这使得在抽象的一段代码上调用 SRP 或不调用 SRP 变得非常困难——它基本上取决于您的应用程序中随着时间的推移一起和分开发生的事情。

但一般来说,UI 是可能独立于程序的其他部分而发展的主要事物之一。用户将一直希望在项目过程中对显示进行少量调整,能够修改表示逻辑而不用担心破坏系统的其余部分是一件好事。持久性是您可能想要更改的另一件事,无论是作为新架构决策的结果还是临时性的,具体取决于上下文(例如,在测试中交换虚拟持久性对象)。

这就是为什么在大多数现实世界的应用程序中,我倾向于按技术责任而不是像 C/R/U/D 这样的同一实体上的业务操作来拆分类。

如果您仔细查看当前的实现,您会注意到类中的模式。他们都在摆弄 MenuManager 和其中存储的 MenuItems 。它们都打印到屏幕上。

如果您想改变数据显示或存储的方式,您基本上必须接触所有这些类。我并不是说在像这样的小型简单系统的情况下这是一个严重的缺陷,但在更大的应用程序中它很可能是一个问题。

换句话说,您的示例可以轻松地通过图形界面将菜单更新完成到 SQL 数据库中,通过命令 shell 将菜单插入到平面文件中,以及菜单读取从 XML 文件中收集数据网络服务。这可能是您在非常特殊的情况下想要做的,但不是大多数时候......

关于python - 针对集合的 CRUD 操作的单一职责原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24160856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com