我试图理解如何从逻辑上区分CRUD职责,以便遵守单一责任原则(SRP)。针对集合的CRUD操作的单一职责原则
正如我理解SRP的定义,单个责任可能不一定是单一行为,而是一个具有明确定义的逻辑边界的行为集合。
在我的例子中,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()
我开始明白了。你所描述的设计会是什么样子?你介意分享一个小提琴吗? – Dowwie
恐怕我的Python技能有点受限,但这里有一个很方便的例子:https://github.com/Finglas/Playground/blob/master/hexagonal.architecture/example.py你会认识到流行的设计模式,比如作为帮助您实施SRP的存储库和控制器。所提到的整体方法是六角形建筑(Hexalonal Architecture)(http://alistair.cockburn.us/Hagagonal+architecture) - 在这样的小程序中它并不重要,但它的想法是识别单个大型同心圆区域,责任对象在你的系统中,每个区域本身具有较高的单一责任。 – guillaume31
[本演示文稿]的第一部分(http://fr.slideshare.net/DrTrucho/python-solid)也说明了我在代码中所说的内容。 – guillaume31