写一个对象中字段的“速记”引用:hows和why?

时间:2016-03-20 05:45:21

标签: java

这里的第一个问题,所以希望我现在不会犯太多失礼

快速版:我想通过为对象聚合中的任意(但已知)字段创建“简写”来节省输入时间。 (我想我说得对 - 仍然掌握某些术语)

我不确定我在这里找到的是否有更好/更准确的术语,我所遇到的任何内容都没有在Java中特别提到过这个概念(尽管我可能完全错过了我的一些重要内容)搜索,我觉得即使我熟悉Java,这个问题也可能对OOP世界更加开放。)

我很确定如果我厌倦了写作,请说:

MyClass myClass = new MyClass();
// ... more code ....

// This is a specific string I need to print out for "Foo"
if(reasonToFoo) {
    System.out.println(myClass.getSomeObject().getSubObject1().getDescription());
}

我觉得我有两个选择:我可以在同一个类中创建一个小帮助函数来“包裹”那个丑陋的对象引用链,让我以后输入更简单:

public String getFooString() {
    return this.getSomeObject().getSubObject1().getDescription();
}

// ... elsewhere ...
if (reasonToFoo) {
    System.out.println(getFooString());
}

我的另一种方法是创建一个帮助对象,其唯一目的是简化对相同字符串的阻碍

class FooString {
    public static String getFrom(MyClass mC) {
        return mC.getSomeObject().getSubObject1().getDescription();
    }
}

// ... elsewhere ...
if(reasonToFoo) {
    System.out.println(FooString.getFrom(this));
}

我的问题是:

  1. 我的方法在这里有效地解决了问题的“方式”吗?在我的解决方案中,我采用合理的OOP做法吗?
  2. 我很难看到很多“为什么”的案例 - 为什么我要使用一个版本处理这个问题而不是其他任何一个?这些实现中的任何一个本身都比其他实现更糟糕吗?
  3. [编辑] :刚刚意识到我可能不会直接访问MyClass实例中的对象,而是通过getter来访问。相应编辑

    背景:自21世纪初以来,我一直在编写各种形式和语言的代码(从TI-83 BASIC开始,通过那个时期的一些基本HTML / JS / CSS扩展,移动使用ActionScript 3并在mIRC中编写脚本,然后再转到Java和Python)并且现在是一名28岁的大学新生,试图更好地掌握编程的设计方面,同时倾向于独立游戏开发一个梦想的工作(意识到一个小隔间农场编程工作对于支付账单更为现实)。

1 个答案:

答案 0 :(得分:1)

从面向对象的角度来看,您的代码违反了Law of Demeter最好让myclass本身提供所需的说明。请参阅此blog

如果在代码中它看起来像这样

public class A
{
    public void someMethod(B b)
    {
        b.getC().getD().getE().doThing();
    }
}

将其改为

是件好事
public class A
{
    public void someMethod(B b)
    {
        b.doThing();
    }
}