2013-06-20 4 views
-2

У меня есть класс, которому нужен доступ к глобальным объектам, объявленным в другом классе. Вероятно, есть несколько ключевых слов, таких как extern, которые позволят мне это сделать. Должен ли я сделать это таким образом или было бы лучше, если бы я создал статический класс «GlobalObjects», который я разрешу всем моим классам получить доступ и просто получить доступ к объектам как таковым: GlobalObjects.Object1.foo();?Лучший дизайн ООП?

Фрагмент кода:

namespace Pong { 
    public class Pong : Game { 
      public Ball ball; 
      public Paddle paddleOne; 
      public Paddle paddleTwo; 

      public Pong() 
       : base() { 
       graphics = new GraphicsDeviceManager(this); 
       Content.RootDirectory = "Content"; 
      } 
      // extra code 
    } 
} 
+1

Как насчет 'public' ...? –

+0

@PrestonGuillot: Итак, просто сделайте все мои классы общедоступными или у вас есть один открытый класс, который имеет доступ ко всему? – user2503465

+2

http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil – spender

ответ

1

Глобальное государство в целом плохая практика . Однако для приложений, где есть много, много объектов, которые могут взаимодействовать со многими, многими другими объектами, иногда имеет смысл иметь какой-то механизм для того, чтобы эти объекты легко находили друг друга. Дизайн игры обычно относится к этой категории, где объекты в игре (персонажи игроков, персонажи NPC, плохие парни, предметы и т. Д.) Должны иметь возможность часто взаимодействовать друг с другом.

Чтобы решить эту проблему, существует шаблон дизайна, называемый «Registry», и он очень часто используется в simple games. Шаблон прост: вы создаете класс Registry, который по существу представляет собой статический список (или набор статических списков) всех элементов, которые должны взаимодействовать друг с другом.

Образец реестра упрощает использование и быстрое развитие за счет ремонтопригодности и рефакторинга, поэтому будьте осторожны, чтобы использовать его надлежащим образом. Если вы просто начнете набивать в него все возможные объекты, то вы очень быстро закончите с неуправляемой кодовой базой. Этот шаблон предназначен для простых игр, которые вряд ли будут очень сложными, а Понг кажется хорошим.

+0

** Закон Деметры ** может быть сильно нарушен с помощью подхода, который пытается предпринять ОП. –

+0

@SimonWhitehead Да, шаблон реестра умышленно нарушает принцип наименьшего знания. Как уже упоминалось, это осознанный компромисс для случаев, когда строгое соблюдение такого руководства было бы необоснованным или иным образом слишком дорогостоящим, учитывая размер проекта. Точно так же, как тривиальное приложение списка дел не нуждается в трехуровневом дизайне, простая игра в понг не всегда должна иметь идеальный охват видимости и разделение проблем. – ean5533

+0

даже с реестром, его гораздо лучше не делать со статическими элементами/списками и т. Д. –

0

Чтобы немного расширить предыдущие комментарии/ответы на этот вопрос. Я согласен с тем, что глобальное состояние обычно указывает на плохой дизайн. Состояние обычно хранится в хранилище данных и, следовательно, может быть доступно по мере необходимости. Дизайн Oop означает, что объекты следуют за набором принципов, таких как Single Responsiblity Principle. Также, что поведение существует в одном и только одном классе.

В вашем случае, не зная больше о том, чего вы пытаетесь достичь: когда вы говорите, что у вас есть глобальные объекты, объявленные в другом классе, вы можете использовать Gang of Four Singleton Pattern. Это глобальный объект отвечает за сохранение своего экземпляра и может передать этот экземпляр тому, кому он нужен. Таким образом, вам не нужен другой класс (ваш класс «глобальных объектов»), что было бы лучше, чем меньше зависимости между классами, тем лучше. Меньше зависимостей между классами означает, что дизайн менее хрупкий, то есть, когда вам нужно внести изменения, менее вероятно, что изменения будут внесены изменениями.

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