2011-12-16 6 views
7

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

EDIT Некоторые из методов предназначены для общих вещей, которые, я считаю, могут быть сделаны статическими. Хотя есть и другие, которые относятся к атрибутам класса, и в этом случае я думаю, что имеет смысл сделать его абстрактным суперклассом.

+2

Невозможно ответить без контекста; многое зависит от того, насколько тесно связаны существующие классы, как используются классы и методы и т. д. –

+1

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

+0

Можете ли вы объяснить, что делает этот метод, и если все эти классы связаны? –

ответ

0

Если он не использует каких-либо членов класса, вы можете сделать это статическим!

Но вы должны сделать это в абстрактном классе или маточного классе

+3

материнский класс ?? Звучит хорошо. –

+0

Здесь очень рано утром: X Не ожидайте слишком многого: D –

1

Еще один момент для рассмотрения может быть видом работы этих функции делают. Если это разбросано, вы должны создать класс facade/helper/util со статическими методами.

2

Это зависит от того, что делает ваш код. Являются ли они полезными методами? Являются ли они специфическими/специализированными методами класса? Это тяжелое многопоточное приложение?

Имейте в виду, что если вы сделаете их статичными, а ваше приложение будет многопоточным, вам придется защищать их w locks. Это, в свою очередь, уменьшает параллелизм. В этом случае, в зависимости от того, сколько потоков вызывает тот же кусок кода, вы можете подумать о переносе его (кода) в суперкласс.

+1

Вам нужно только блокировать статические методы, если они с точки зрения состояния – user949300

+1

@ user949300 Я согласен. Я делал предположения. – Adrian

5

Ну, я следую правилу: Не используйте базовый класс для удаления дублирования кода, используйте класс утилиты.

Для получения наследства задайте вопрос себе: Существует ли связь Is-A?

Еще одно правило, что в большинстве случаев является правильным, является: Предпочитает состав по наследству

используя статического вспомогательного класса не соответствует действительности состава, но это можно назвать выводом из него.

Примените эти правила к своим специалистам и принимайте решение, имея в виду maintanence и масштабируемость. Однако будет хорошо, если вы сможете добавить дополнительные сведения к своему quesiton.

+0

Более подробная информация уменьшила бы догадки, но мне нравятся эмпирические правила, которые вы упомянули. –

0

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

В противном случае это ваш звонок, и вы, вероятно, передумаете позже. :-)

1

Как уже упоминалось, ответ на этот вопрос зависит от контекста проблемы и дублированного кода.

Некоторые вещи, чтобы рассмотреть

  • мутировать ли дублированный код экземпляра объекта. В этом случае защищенный метод в общем абстрактном классе
  • Вместо класса статической утилиты рассмотрим одноэлементный метод, статические методы могут быть проблематичными для чистого модульного тестирования, хотя тестирование платформ улучшается.
  • Наследование может быть сложным, чтобы получить право, подумайте, действительно ли эти объекты из разных классов связаны друг с другом и требуют какого-либо повторного факторинга OO? или они являются непересекающимися частями логики домена, которые требуют аналогичных бит кода.
0

На первый взгляд, я бы сказал, что было бы лучше сделать общий код общедоступным статическим методом в открытом классе. Это позволит сделать метод полезен для любого класса, используя только

UtilityClassName.methodName(); 

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

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

Но опять же, если эти переменные являются постоянными значениями, то эти постоянные значения в интерфейсе. Внедрите этот интерфейс в свой класс. И снова сделайте его статическим методом в этом классе утилиты, который будет напрямую использовать эти константы.

См., Например, Рассмотрим foll. общий код возвращаемой области круга.

public interface TwoDimensional{ 
     double PI = 3.14; 
    } 

    public class MyUtility implements TwoDimensional{ 
     public static double getCircleArea(double radius){ 
      return PI*radius*radius; 
     } 
    } 

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

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