2016-03-20 1 views
0

Первый вопрос здесь, так что надеюсь, я не совершаю слишком много бестактности в данный моментНаписание «стенографических» ссылок на поля внутри объекта: хау и whys?

Быстрой версия: Я хочу, чтобы сэкономить время, набрав путем создания «Shorthands» для произвольных (но известных) полей в агрегирование объекта. (Я думаю, что я говорю это правильно - все еще понимая определенную терминологию)

Я не уверен, есть ли более/более точная терминология для того, что я ищу здесь, и ничего, с чем я столкнулся, специально упомянул об этой концепции на Java (хотя я мог полностью пропустить что-то важное в моем поиске, и я чувствую, что, хотя мое знакомство с Java, этот вопрос, вероятно, более открыт для мира ООП в целом).

Я уверен, что если я устал от написания, скажем:

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()); 
} 

Я чувствую, что у меня есть два варианта: я могу сделать небольшую вспомогательную функцию, в том же классе, чтобы «обернуть» вокруг этой uglyish цепочки ссылок на объекты, что делает его проще для меня, чтобы напечатать позже:

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. ли мои подходы здесь эффективно решить «как» проблемы? Как и в том, применяю ли я разумные методы ООП в своих решениях?
  2. Мне тяжело видеть много случаев для «почему» - почему я хотел бы использовать одну версию решения этой проблемы над любым из других? Любая из этих реализаций по своей сути хуже других?

[EDIT]: Просто понял, что я, вероятно, не должен быть доступ к объектам в пределах экземпляра MyClass непосредственно, так и через добытчиками вместо этого. Editted соответственно


фон: Я пробовал себя в написании кода в различных формах и языках с начала 2000-х годов (начиная с TI-83 BASIC, проходящее через некоторые основные HTML/JS/CSS этого периода, в течение некоторого периода работал с ActionScript 3 и скриптировал в mIRC, прежде чем переходить на Java и Python), и теперь я 28-летний первокурсник в колледже, пытаясь лучше понять дизайн-интерфейс программирования, а также заниматься разработкой инди-игр как работа мечты (с осознанием того, что работа по программированию фермы в кабине более реалистична для оплаты счетов).

+0

* «Как и в, я используя разумные методы объектно-ориентированного программирования» * Нет, нет. С 'mC.someObject.subObject1.description' вы напрямую обращаетесь к полям, и практика ООП скрывает внутренности класса, то есть все поля должны быть« частными »и доступны только с помощью методов getter. Однако создание дополнительного метода getter на внешнем классе для получения значения из внутреннего класса очень допустимо и фактически помогает скрыть внутренности внешнего класса, т. Е. Тот факт, что он является составным классом. – Andreas

+0

@ Andreas Да, я понял ошибку при доступе к полям непосредственно после того, как я разместил их, и обновил их соответствующим образом. Это не было главной задачей моего поста, но это действительно правильный момент, и как ученик я должен уделять больше внимания таким вещам;) – studioKeywi

+0

Второй вариант имел бы смысл, если получение строки Foo не просто простая выборка значения, но должна сочетаться с небольшой обработкой, например, каким-либо образом ее редактированием. Тогда 'getFrom' должен быть правильным методом, и вы можете иметь несколько классов' FooString' для различных вариантов редактирования. Но см. Также: образец дизайна «Декоратор». – laune

ответ

1

С объектно-ориентированной точки зрения ваш код нарушает Law of Demeter Это хорошо, чтобы спросить сам myclass дать требуемое description.quoting из этого blog.

Если в коде выглядит следующим образом

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

его хорошо, чтобы изменить что

public class A 
{ 
    public void someMethod(B b) 
    { 
     b.doThing(); 
    } 
} 
+0

Итак, если бы я хотел следовать этому совету, я бы хотел, чтобы мой открытый публичный класс B {public ReturnType doThing() {}} 'выполнял вызов через соответствующие объекты (в данном случае' public class C {} ') и либо выполнить мой возврат обратно, либо выполнить какие-либо шаги, выполнив любые изменения в моих возвратах (если необходимо, например, если B необходимо сохранить копию извлеченной информации для использования позже, она сделает это до передачи элемента управления обратно в исходное 'someMethod()' call) – studioKeywi

+0

yes..The идея здесь Объект класса c относится только к объекту b. Если нужен класс A, он должен только попросить объект b дать требуемое значение – nvinayshetty

Смежные вопросы