常量细节应该是抽象或实现的一部分吗?

时间:2015-12-07 21:06:31

标签: java oop

我的应用程序中有一个SaveSettings网络操作。 我正在使用适配器,以便将来可以自由插入另一个网络库,而不是更改我的任何代码。

public interface SaveSettingsOnServerAdapter {
    void saveSettings(User user, OnSaveSettingsOnServerListener listener);
}

public class SaveSettingsOnServerAdapterImpl implements SaveSettingsOnServerAdapter {

    private static final String API_USER_SESSION_HEADER = "Cookie";
    private static final String API_SAVE_SETTINGS_PATH = "user/{user_id}/update";
    private static final String API_SAVE_SETTINGS_USER_ID_PATH_PARAMETER = "user_id";
    private static final String API_SAVE_SETTINGS_SYNC_WITH_CALENDAR_PARAMETER = "sync_with_calendar";
    private static final String API_SAVE_SETTINGS_USE_MOBILE_NETWORK_PARAMETER = "use_mobile_network";



    @Override
    void saveSettings(User user, OnSaveSettingsOnServerListener listener) {
        // Some implementation here, in my case - RETROFIT
    }


}

我的直觉告诉我,在实现类中定义的常量中概述的那些细节与我选择用于网络的任何网络库无关,因此它们应该是抽象的一部分,对吧?

如果是这样,我应该声明SaveSettingsOnNetworkAdapter摘要并将其插入那里吗?然后SaveSettingsOnNetworkAdapterImpl扩展它而不是实现它?在使用适配器模式时扩展抽象类而不是实现接口是一个问题吗?

2 个答案:

答案 0 :(得分:1)

抽象的想法是让你的代码更通用。这应该尽可能地隐藏实现。将常量添加到抽象层将揭示一些实现细节。最好的方法可能是将常量添加到实现类中,或者使用这些常量创建一个新类。

答案 1 :(得分:1)

将接口降级为抽象类并非没有问题。你强制所有未来的实现扩展该类,只扩展该类,而目前你可以将接口附加到几乎任何东西。

另外,参数可能是不变的(据您现在所知)但SaveSettingsOnServerAdapter确实需要保持&定义它们?

他们肯定是必需的。但其他地方也可以提供要求。最通用/最抽象的解决方案是定义另一个接口,该接口提供值并将该接口的依赖项添加到每个SaveSettingsOnServerAdapter实现的构造函数中。

如果您不想重复该构造函数,那么这将是一个创建实现SaveSettingsOnServerAdapterImpl的抽象类并覆盖公共代码以处理外部接口的好地方。

但这取决于你。是否需要更多封装以及您希望的程度取决于您正在处理的内容。在一个不会改变的微小工具中是没有意义的,因为抽象旨在使变更变得容易。更多的抽象也意味着更多的代码和更多的代码意味着更多的地方可以破解。

public interface ServerConfiguration {
    String getHeader();
    String getPath();
    ...
}

public enum DefaultServerConfiguration implements ServerConfiguration {
    INSTANCE;
    private static final String API_USER_SESSION_HEADER = "Cookie";
    private static final String API_SAVE_SETTINGS_PATH = "user/{user_id}/update";
    ...

    @Override
    public String getHeader() {
        return API_SAVE_SETTINGS_PATH;
    }

    @Override
    public String getPath() {
        return API_SAVE_SETTINGS_PATH;
    }
    ...
}
public class SaveSettingsOnServerAdapterImpl implements SaveSettingsOnServerAdapter {

    private final ServerConfiguration config;
    public SaveSettingsOnServerAdapterImpl(ServerConfiguration config) {
        this.config = config;
    }

    @Override
    void saveSettings(User user, OnSaveSettingsOnServerListener listener) {
        new Request().withHeader(config.getHeader());
    }

}

public class UserOfAllThis {
    new SaveSettingsOnServerAdapterImpl(DefaultServerConfiguration.INSTANCE);
}