два типа сборки - дублированный код.Не хорошее решение - PullRequest
1 голос
/ 22 мая 2019

Android Studio 3.4

У меня есть следующая активность:

public class CartActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        someCommonMethod()
    }

    private void someCommonMethod() {
        // some code
    }
}

Теперь у меня есть 2 типа сборки: debug и release. В debug добавляю метод someDebugMethod() к активности

public class CartActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        someCommonMethod()
        someDebugMethod()
    }

    private void someCommonMethod() {
        // some code
    }

    private void someDebugMethod() {
        // some debug code
    }
}

В release Я добавляю метод someReleaseMethod() к активности

public class CartActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        someCommonMethod()
        someReleaseMethod()
    }

    private void someCommonMethod() {
        // some code
    }

    private void someReleaseMethod() {
       // some debug code
    }
}

Я читаю официальную документацию

и теперь структура проекта:

app\src\debug\java\com\myproject\CartActivity.java
app\src\release\java\com\myproject\CartActivity.java

Я удаляю CartActivity.java из app\src\main\java. Итак, в результате у меня есть два файла CartActivity.java.

Nice.

А теперь, когда я запускаю приложение в debug типе сборки, затем запускаю CartActivity в папке debug . И когда я запускаю приложение в release тип сборки, затем запускаю CartActivity в release folder.

Nice. Работает нормально.

Но предположим, теперь мне нужно обновить общий метод someCommonMethod(). Этот метод используется в обоих типах сборки .

В результате мне нужно обновить ДВАЖДЫ этим методом. Сначала в app\src\debug\java\com\myproject\CartActivity.java и затем обновите тот же метод с тем же кодом в app\src\release\java\com\myproject\CartActivity.java

Так что я думаю, что это нехорошо.

Потому что это дубликат кода. Мне нужно копировать и вставлять КАЖДЫЙ время в ДВА файла при методе обновления someCommonMethod().

Это действительно плохо.

Как избежать этого дубликата кода?

Идеальный подход, когда в CartActivity.java есть только дельта .

  1. В app\src\debug\java\com\myproject\CartActivity.java есть ТОЛЬКО метод someDebugMethod()
  2. В app\src\release\java\com\myproject\CartActivity.java есть ТОЛЬКО метод someReleaseMethod()

и общие код в app\src\main\java\com\myproject\CartActivity.java

Возможно ли это?

P.S. Предположим, у меня есть 3 типа сборки. В результате мне нужно обновить один и тот же код в трех файлах . Это действительно не хорошо.

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Просто создайте CommonCartActivity in

app\src\main\java\com\myproject\CommonCartActivity.java

Затем расширьте класс, переопределяющий методы в реализациях flavor.

public class CartActivity extends CommonCartActivity {

    protected void someCommonMethod() {
        // some code
    }
}

Таким образом CartActivity просто наследуется от CommonCartActivity ни с чем, продублированы в двух вариантах.

0 голосов
/ 22 мая 2019

Думаю, вам не нужно усложнять структуру проекта. Просто используйте проверку в реальном времени.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cart);

    someCommonMethod();

    if(BuildConfig.DEBUG){
        someDebugMethod();
    }else{
        someReleaseMethod();
    }
}

private void someCommonMethod() {
    // some code
}

private void someDebugMethod() {
    // some debug code
}

private void someReleaseMethod() {
    // some release code
}

Но, если вам нужно разделить код, попробуйте использовать один activity, но создайте новый class (например, Fork) в двух копиях для выпуска и отладки. Создайте экземпляр class в activity. В этом class будет doMetnod(), который будет иметь необходимый код в зависимости от типа проекта. Таким образом, вы избегаете дублирования кода activity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...