Является ли объект Java с сотнями методов дорогим? - PullRequest
2 голосов
/ 11 июля 2020

У меня есть класс, как показано ниже, с сотнями методов:

public class APIMethods {


public ToView toView;

public APIMethods(ToView toView) {
    this.toView = toView;
}


public static final int SUCCESS = 1;
public static final int ERROR = 0;


public void registerAnonymous(String deviceId, String installRef, final int requestCode) {
    APIInterface apiService =
            RetrofitClientInstance.getRetrofitInstance().create(APIInterface.class);
    JsonObject obj = new JsonObject();
    obj.addProperty("androidId", deviceId);
    obj.addProperty("projectId", 0);
    obj.addProperty("ChannelName", installRef);
    Call<Response<BasicUser>> call = apiService.registerAnonymous("application/json", Utils.getFlavorId(), obj);
    call.enqueue(new Callback<Response<BasicUser>>() {
        @Override
        public void onResponse(Call<Response<BasicUser>> call, Response<Response<BasicUser>> response) {
            Response<BasicUser> mResponse;
            try {
                mResponse = response.body();
                if (mResponse.getErrorCode() == 0)
                    toView.updateView(requestCode, SUCCESS, mResponse);
                else
                    toView.updateView(requestCode, ERROR, mResponse);
            } catch (Exception e) {
                mResponse = new Response<>();
                mResponse.setErrorCode(-1);
                toView.updateView(requestCode, ERROR, mResponse);
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<PetMarkResponse<BasicUser>> call, Throwable t) {
            Response<BasicUser> numberValidationResponse = new Response<BasicUser>();
            numberValidationResponse.setErrorCode(-1);
            toView.updateView(requestCode, ERROR, numberValidationResponse);
        }
    });
}

///And dozens of such method
}

Итак, в других моих классах повсюду в моем приложении я просто создаю экземпляр класса и вызываю метод, который мне нужен:

APIMethods api = new APIMethods(this);
api.registerAnonymous(Utils.getAndroidId(this), BuildConfig.FLAVOR, STATE_REGISTER_ANONYMOUS);

У меня вопрос, насколько дорого стоит этот объект (api)? Обратите внимание, что в каждом классе вызывается несколько методов объекта.

Ответы [ 3 ]

2 голосов
/ 11 июля 2020

Объект совсем не дорогой.

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

Ситуация была бы иной, если бы у вас было 100 полей вместо 100 методов.

Возможно, вы захотите подумать, является ли хорошей идеей наличие сотен методов в одном классе. Легко ли понимать и поддерживать код? Это пример антипаттерна «объект Бога»? https://en.m.wikipedia.org/wiki/God_object

1 голос
/ 11 июля 2020

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

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

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

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

0 голосов
/ 11 июля 2020

Попытайтесь определить класс Cohesive до тех пор, пока методы не будут написаны относящимися к классу и не определят его цель.

Ссылка ниже описывает важность методов для класса:

https://www.decodejava.com/coupling-cohesion-java.htm

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