使用字典而不是创建类更好

时间:2017-09-24 06:36:18

标签: swift

我过去经常做以下事情:

class A {
   var param1:String?
   var param2:[B]?
}

class B {
   var param1:String?
   var param2:String?
   var param3:[C]?
}

class C {
   var param1:String?
   var param2:String?
}

但最近我发现字典更灵活。 A类可以用以下字典替换。

[
    "param1":"some string",
    "param2":[
        "param1":"some string",
        "param2":"some string",
        "param3":[
            "param1":"some string",
            "param2":"some string"
        ],
        [
            ...
            ...
        ]
    ],
    [
        ...
        ...
    ],
    ...
]

如果我们想在C类中添加“param3”,我们需要修改很多相关代码(如果使用class)。但是如果我们使用字典,我们可以使用“param3”,就好像它已经存在一样。

字典就像运行时定义的类。我想知道我们是否应该在所有情况下使用字典替换数据存储类(即MVC模式中的模型)。

2 个答案:

答案 0 :(得分:0)

这取决于您对模型的使用。通过创建小类,您可以为每个类提供特定的附加行为(例如,更具体的隔离附件方法或帮助程序)。 您还可以通过仅使用您想要的部件并模拟另一个来更轻松地测试模型。

总的来说,由于维护和可测试性以及清晰的代码,拆分责任更好。

如果你的字典失去控制,那么你的团队中的新手很难使用和理解巨大的数据,而不是处理很多与他们之间有关系的小对象。

如果添加新参数,则可能需要更改许多初始值设定项。 我会说,这是正常的。

此外,它还取决于您如何管理模型初始化。也许您在其余代码中使用了一个隐藏这种复杂性的工厂。 或者您可能只需要在依赖注入根目录中更改它。

这显然取决于您正在创建的对象的方法和范围。

但在我看来,孤立的对象比字典中的大量数据更可重用

答案 1 :(得分:0)

我同意字典更易于扩展, 类更安全。

关于字典的一个不安全的事情是,在编译时你不知道密钥是否存在。只要您想访问某些内容,就必须在所有位置放置guard letif let语句。如果您不这样做,当密钥不存在时,应用程序将在运行时崩溃。当然,你可以在它崩溃后修复它,但你浪费了很多时间来运行你的应用程序并使错误的代码行运行并崩溃。

另一个不安全的事情是类型不安全。由于您的词典包含不同类型的内容,因此它必须是[String: Any]。通常你可以用类来做到这一点:

someAObject.param2!.first!.param3!.first!.param1

如果您使用词典,则需要:

(((dict["param2"]! as! [[String: Any]]).first!["param3"] as! [[String: Any]]).first! as! [String: Any])["param1"]

看看有多少代码!此外,当您希望方法接受参数时,如果您正在使用类,则可以编写ABC,并且该方法仅接受您指定的类型。如果您使用的是词典,那么您只能写[String: Any]。没有编译时检查该字典是否属于可接受的类型。

第三件事就是打字错误。如果您输入的属性名称错误,Xcode会在您运行应用程序之前告诉您。如果您键入错误的字典键,Xcode将不会告诉您。你必须运行那段代码才能知道。当然,你可以把钥匙放入常数,但这很麻烦,麻烦肯定超过你所说的"好处"字典。

第四点是字典是值类型。您可能需要某些引用类型的功能。

最后但并非最不重要的是,你无法在字典中添加方法!类的一个非常重要的特性是它们允许您添加方法,您可以在类的实例上调用它们。如果你善用它,你可以编写非常易读的代码。

  

如果我们想添加" param3"在C类中,如果使用类

,我们需要修改很多相关代码

如果您设计好模型,那就不行了。我无法想到为什么在类中添加新属性需要更改大量相关代码的原因。