我应该使用通用或具体的setter和getter来处理映射实体吗?

问题描述

我有一个应用程序,用户可以在其中更改某些设置。用户可以更改(设置)和读取(获取)其设置,这是一种类似于映射的结构。 我制作了一个UserSettingsInteractor对象,该对象实现了更改和读取设置的用例,在Python中,它看起来像:

class UserSettingsInteractor:

    def __init__(self,...): ...

    def set_foo(self,user_id: int,value): ...
    def get_foo(self,user_id: int): ...
    
    def set_bar(self,value): ...
    def get_bar(self,user_id: int): ...

    ...

其中的优点是现有设置foobar是明确的。但是写一个setter和getter使它变得很冗长。可以概括为:

class UserSettingsInteractor:

    def __init__(self,...): ...

    def set(self,setting: str,value): ...
    def get(self,setting: str): ...

现在,客户端代码知道设置的表示方式,它是一个键值对。难道不是会使代码更脆弱吗?

哪种方法更好?

解决方法

我认为,通用方法不会给您带来更多好处:

  • 这不是更好的可读性-设置名称将仅作为参数而不是函数名称出现。而且您将必须在getter / setter内部实现一个长例语句,而不是在类级别区分几个函数。
  • 同一级别的耦合-如果设置发生更改(例如,商品的数量或名称),您仍然必须在客户端和服务端都进行更改。
  • 您不会在编译时看到语义错误(我想这就是您所说的“脆弱”的意思)。

使用我能想到的通用方法的唯一原因是,由于某种原因,您需要一个独立于特定设置的稳定接口,例如,如果您要开发通用的UserSettings服务,在另一个应用程序场景中重用。

进一步阅读:Concrete vs Generic – The story of a data model