直接使用数组与创建另一个类来存储同一数组(建议选择设计)

时间:2019-03-13 20:30:31

标签: arrays class oop object design-patterns

我的同事喜欢将OOP与实际的工作方式联系起来,但是有点过分,有时我以一种尴尬的方式相信。

实例1:
他总是建议不要使用静态变量来跟踪所有实例,而是创建另一个类,然后在该类中创建一个数组,以仅使用单个静态变量(当然具有适当的特权)即可完成所有操作。因此,假设我有一个名为“ Card”的类,据他说,我不应该使用静态变量来跟踪卡,而应该有另一个名为“ CardsList”的类,并在此类“ CardsList”中创建一个数组来跟踪卡

    with open("foobar.yml", 'r') as stream:
            foobar = yaml.load(stream)
    end_value = 0
        for one_value in foobar["A1"]["A3"]["A3A"] ["A3A1"][*]:
           end_value = end_value + one_value 

vs

//in the main class  
private CardsList Cards = new CardsList(); 

//in CardsList class
static List<card> CardsList = new ArrayList<>();

实例2:
如果我们要创建一个简单的股市模拟。
我宁愿创建一个称为市场的类,并将该市场的待处理订单存储在该类市场中的数组中。
另一方面,他要我创建一个名为PendingOrders的类,其中只包含一个数组,什么也不做,但该数组在类市场中的作用。像这样:

//in the cards class
static List<card> CardsList = new ArrayList<>();

vs

//in the market class    
private PendingOrders pendingOrders = new PendingOrders();

//in the PendingOrders class
private List<order> pendingOrders = new ArrayList<order> ();

他给出理由的答案完全没有用,我认为他是盲目地遵循别人告诉他的。

有人可以帮我比较这两种方法吗?什么时候可以比另一个更有利?

2 个答案:

答案 0 :(得分:0)

在传递信息时,将对象列表封装在类的实例中会很有用。如果以后发现需要添加更多信息,将其子类化或替换其外观,则无需更改进行传递的代码。

使用静态字段通常被视为anti-pattern

我认为您来这里寻找不同的方式来查看这些选项是一件好事,但有点担心您可能已经与同事深入探讨了自己的观点。尝试从战es中走出来,从两侧看事物。

无论是为了简单还是为了封装,都有话要说。您希望封装能在大多数代码库中得到回报,这些代码库必须经过变更的迭代,并由不止一个程序员维护,并且随着时间的流逝可能变得更加多样化和复杂。

我认为您的问题范围很广,也许不是最适合像这样的问答形式。阅读OO编程可能是一种更好的方法,可以更深入地了解其背后的原因以及在何处(何处不适用)。

答案 1 :(得分:0)

{ "index": "/index.html", "assetGroups": [{ "name": "app", "installMode": "prefetch", "resources": { "files": [ "/favicon.ico", "/index.html", "/*.css", "/*.js" ] } }, { "name": "assets", "installMode": "lazy", "updateMode": "prefetch", "resources": { "files": [ "/assets/**", "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)" ] } }], "dataGroups": [{ "name": "api-freshness", "urls": [ "https://firebasestorage.googleapis.com/v0/b/mysuperrpwapp.appspot.com/" ], "cacheConfig": { "maxSize": 100, "maxAge": "180d", "timeout": "10s", "strategy": "freshness" } }] } “变量”表示代码有异味

static变量(例如用于存储类实例的非常量列表)类似于单例(反)模式,由于将类与特定用例紧密耦合,该模式具有很多污名化,因此设计使其可重用性较低。

为什么static变量的气味像单例模式一样?

要详细说明这种比较,如果您将static类本身视为值而不是类型(JavaScript和原型继承的思想,即“一切都是对象” ),如果您想仅跟踪其实例的特定子集而不是其所有实例,而要对其进行多种不同的使用,则重用该类将变得很困难,因为这种特定的实现会使您陷入困境。

使用类似Card的单独类来封装CardsList类实例的存储是一个好主意,因为如果需要跟踪,它将提高Card类的可重用性Card中的多个,而不仅仅是List<Card>所有实例

Card成员可接受用途的示例

面向对象编程中的

static成员应保留用于常量值或以某种方式处理类而不引用其现有特定实例的方法。 static成员的其他用途应仅在无法合理应用其他模式的极端情况下才需要,因为这会使类的可重用性降低。


总而言之,如果拟议的static成员不是方法或常数,则很可能表明是反模式或充斥着代码味道。