2016-06-24 3 views
2

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

Допустим, у меня есть метод (который проверяет условия и перенаправляет пользователя на различные действия). Этот метод используется множеством классов.

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

Или

Создайте базовую активность, добавьте метод там, и любая деятельность, которая должна использовать этот метод, наследует от базовой деятельности. (Предположим, что в данном случае мы с Одиночным наследованием).

Мысли?

EDIT Это связанные сообщения, которые я проверил, связанные с этим. Не удалось сформировать решение, основанное на этих

Utility classes are evil?

If a "Utilities" class is evil, where do I put my generic code?

+0

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

+0

@SarthakMittal Спасибо. Но мне интересно узнать, что помогло вам в принятии этого решения пойти с классом полезности, а не использовать базовую активность, перемещая там методы и наследуя этот класс с помощью какого-либо действия с использованием этого метода? – RmK

+1

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

ответ

1

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

В качестве примера некоторые псевдо-код:

Ваш Utility класс:

public class Utility implements IUtility { 
    @Override 
    public void add() { ... } 

    @Override 
    public void remove() { ... } 
} 

Ваш Utility используя класс:

public class UtilityUsingClass { 
    private IUtility utility; 
    public UtilityUsingClass(IUtility utility) { 
     this.utility = utility; 
    } 

    public void myMethod() { 
     // Use Utility class 
     utility.add(); 
     ... 
    } 
} 

В тесте он может выглядеть следующим образом:

@Test 
public void testMyMethod() { 
    UtilityUsingClass testClass = new UtilityUsingClass(new UtilityMock()); 
    testClass.myMethod(); 

    // assert stuff 
} 

UtilityMock:

public class UtilityMock implements IUtility { 
    @Override 
    public void add() { // Implements mock logic ... } 

    @Override 
    public void remove() { // Implements mock logic ... } 
} 
+0

Спасибо. Я не уверен, что вполне понимаю, что вы имели в виду. – RmK

+0

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

+1

есть много причин, некоторые из которых перечислены на этом сайте (http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html), а также способность тест и изменить введенные классы очень хорошо использовать –