ООП дизайн маленьких вспомогательных классов - PullRequest
5 голосов
/ 15 мая 2019

Допустим, у меня есть класс С, который выполняет какую-то работу.

Для этого мне нужен маленький очень простой вспомогательный класс H (например, представление пары или 3-кортежа).H требуется только в C.

Я бы поместил H внутри C.

class C
{
   void foo ()
   {
     // ... use H to do the job more easy ...
   }

   class H
   {
      // very simple and contained stuff
   }
}

Является ли размещение H внутри C хорошей идеей?Я делаю это, чтобы это содержало, и в том месте, которое, я думаю, должно быть, и нигде больше.Но я не уверен, что это хороший дизайн.

Ответы [ 3 ]

6 голосов
/ 15 мая 2019

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

4 голосов
/ 15 мая 2019

Дополнительные сведения:

Первое: если предполагается, что объекты H существуют без собственного экземпляра C, то значение H должно быть static.Вы могли бы даже хотеть сделать это частным.

Затем, имейте в виду: у вас здесь есть внутренний класс, поэтому полное имя H на самом деле что-то вроде what.package.com.CH .Другими словами: вы действительно привязали H к C.

Что если в какой-то момент вы решите, что у H достаточно других аспектов, которые делают его достойным быть "своим"?Тогда вам, возможно, придется прикоснуться к еще одному коду, чтобы превратить ваш what.package.com.CH в what.package.com.H .

Таким образом, вы может рассмотреть возможность сделать H классом верхнего уровня, но не сделать его общедоступным.Таким образом, вы сохраняете его в C.java, но не как внутренний класс!

(но, конечно, это действительно зависит от "стиля", я думаю, что стандарт кодирования java Google говорит, что вы должны иметь только один класс верхнего уровня на файл .java)

Заключительные слова: если есть способ превратить ваш класс H в нечто, что может использоваться в других местах, то я быидите вперед и сразу сделайте его публичным классом.Если повторное использование кажется разумным, напишите свой код, чтобы его можно было легко использовать повторно!И трёхзначный кортеж не звучит так, как будто он очень специфичен для чего-либо, поэтому он звучит как кандидат для повторного использования.

3 голосов
/ 15 мая 2019

Да, это хороший дизайн.То, что вы пытаетесь сделать, называется внутренний класс . Вы также можете сделать его закрытым.Если ему не нужен эксклюзивный доступ к членам внешнего класса, сделайте его статическим вложенным классом, для этого потребуется меньше памяти.

...