2016-04-18 3 views
2

Давайте предположим, что у меня есть планеты и звезды классы и класс GameLogic следующим образом(Подключение) методы «Наведение мостов» между удаленными классами

//Planet.java 
package Game; 

class Planet //invisible outside of package 
{ 
    public String getType() {return "Im a Planet";} 
} 

.

//Star.java 
package Game; 

class Star //invisible outside of package 
{ 
    public String getType() {return "Im a Star";} 
} 

.

//GameLogic.java 
package Game; 

public class GameLogic //notice the PUBLIC keyword 
{ 
    //arrayList of stars 
    //arrayList of planets 

    //a ton of methods for the logic of the game itself 
} 

Все они принадлежат к пакету игры, который обрабатывает только всю логику игры без ввода/вывода.

Затем в другом пакете UI у меня есть класс Text (UI.Text), который управляет вводом пользователем, выводит на печать и имеет прямой доступ к GameLogic, потому что игра может быть воспроизведена только путем создания экземпляра GameLogic класс.

//Text.java 
package UI; 
import Game.*; 

public class Text 
{ 
    //some control vars 

    //MAIN method 
    //input and output methods 
    //bla bla bla 
} 

Так вопрос: Игра будет конкретизируется в Text.java путем создания экземпляра GameLogic. Учитывая это, если я хотел вывести GetType() функции из Star и планеты, я должен был бы завершить «дорогу», который соединяет текст с Планетой/Star следующим образом

//GameLogic.java 
package Game; 

public class GameLogic 
{ 
    //same as before 

    public String getPlanetType(int n) {return planetArrayList.get(n).getType();} 
    public String getStarType(int n) {return starArrayList.get(n).getType();} 
} 

Короче говоря, Методы getType() уже существуют в «слишком отдаленном» классе, поэтому он заставляет меня создавать эти простые, но повторяющиеся «мостиковые» методы для соединения обоих концов. версия

TL-DR:

class A has getType() 

class B has array of A 

class C needs to access getType() from array of A in B 

Я считаю, что это очень неэффективно и время метод трудоемкий и что есть лучшая альтернатива (возможно, с участием интерфейсов?), так что если кто-нибудь может дать мне некоторую помощь , Я был бы очень благодарен.

Спасибо

+1

прочитайте про * Закон Деметры *, как вы его не нарушаете, находится в каждом конкретном случае, но мое ** мнение ** заключается в том, что вы не должны возвращать их, как это, а непосредственно соответствующий объект. –

+2

Почему Star и Planet не являются общедоступными, если класс Text нуждается в них? Другими словами, если A нуждается в информации о C, он не должен проходить через B, он должен просто иметь доступ к C напрямую. Это «Закон Деметры». –

+0

@ChrisWohlert Это для проекта колледжа, и требуется разделить интерфейс и логику игры на отдельные пакеты, я предполагаю, чтобы научить нас сделать наш код максимально универсальным и адаптируемым, поэтому с ним могут работать разные пакеты. Хотя это и не требуется, я решил сделать только один класс общедоступным, поэтому, импортировав пакет Game, вы можете создать экземпляр самой игры только через один класс. – joaoA

ответ

1

Не считают, ничего о производительности.

Единственное, что имеет значение, это реальность.

И в действительности JIT чаще всего будет пытаться оптимизировать микро-оптимизацию.

Смысл: не беспокойтесь о производительности (слишком много), пока не увидите реальные проблемы. Если у вас есть проблемы, запустите , измеряя вместо предположений.

Вместо этого: сосредоточиться на хороших, чистых конструкций; следуйте принципам SOLID; и писать чистый, читаемый, поддерживаемый код. Это будет стоить в сто раз больше, чем беспокоиться о таких тонкостях.

(и просто чтобы дать вам пример: метод getType(), который возвращает Строки уже выглядит как сломанный дизайн Рассмотренных с помощью перечислений Или еще более странно:.? Вы понимаете, что в одиночку с помощью различных классов, ваших объектов имеют разные ?)

И если вы все еще думаете, что вам следует изучить производительность, чем начать читать JIT, как это работает, что он делает и так далее.

+0

Я ценю ответ на тонну и действительно буду больше смотреть в концепцию SOLID. Функция getType(), возвращающая String, была просто неопределенным примером, кстати, это для проекта колледжа в java. У меня уже есть немного знаний и гибкости в ООП, хотя я пытаюсь заполнить некоторые пробелы в упомянутых знаниях. Как смешно, так и грустно, как пользователи stackoverflow лучше учителей, чем те, чьи зарплаты я могу заплатить. Спасибо! – joaoA

+0

Добро пожаловать. – GhostCat

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