java - 干净的代码——以下划线开头的 protected 方法的目的是什么?

标签 java

我正在阅读 Uncle Bob 的 Clean Code。在第 16 章中,本书展示了如何重构示例。有一部分我无法理解这样写的目的。

  • 这里使用protected关键字的目的是什么?
  • 为什么像 _getMinimumYear() 这样的一些方法以下划线开头?
  • 为什么要使用一对同名方法而不是像
    public abstract int getMinimumYear();这样的抽象方法

public abstract class DayDateFactory {

    private static DayDateFactory factory = new SpreadsheetDateFactory();
    public static void setInstance(DayDateFactory factory) {
        DayDateFactory.factory = factory;
    }

    protected abstract DayDate _makeDate(int ordinal);
    protected abstract DayDate _makeDate(int day, Month month, int year);
    protected abstract DayDate _makeDate(int day, int month, int year);
    protected abstract DayDate _makeDate(java.util.Date date);
    protected abstract int _getMinimumYear();
    protected abstract int _getMaximumYear();

    public static DayDate makeDate(int ordinal) {
      return factory._makeDate(ordinal);
    }

    public static DayDate makeDate(int day, Month month, int year) {
      return factory._makeDate(day, month, year);
    }

    public static DayDate makeDate(int day, int month, int year) {
      return factory._makeDate(day, month, year);
    }

    public static DayDate makeDate(java.util.Date date) {
      return factory._makeDate(date);
    }

    public static int getMinimumYear() {
      return factory._getMinimumYear();
    }

    public static int getMaximumYear() {
      return factory._getMaximumYear();
    }
}

    public class SpreadsheetDateFactory extends DayDateFactory {
    public DayDate _makeDate(int ordinal) {
    return new SpreadsheetDate(ordinal);
    }

    public DayDate _makeDate(int day, Month month, int year) {
    return new SpreadsheetDate(day, month, year);
    }

    public DayDate _makeDate(int day, int month, int year) {
    return new SpreadsheetDate(day, month, year);
    }

    public DayDate _makeDate(Date date) {
    final GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTime(date);
    return new SpreadsheetDate(
    calendar.get(Calendar.DATE),
    Month.fromInt(calendar.get(Calendar.MONTH) + 1),
    calendar.get(Calendar.YEAR));
    }

    protected int _getMinimumYear() {
    return SpreadsheetDate.MINIMUM_YEAR_SUPPORTED;
    }

    protected int _getMaximumYear() {
    return SpreadsheetDate.MAXIMUM_YEAR_SUPPORTED;
    }
}

最佳答案

Python 使用 leading underscore可以说该方法是内部的,而不是与外界签订的任何契约(Contract)的一部分。看起来 Uncle Bob 正在做类似的事情,除了这里当然没有工具支持。随着时间的推移,他将注意力从为熟悉 C++ 的读者写作转向为熟悉脚本语言的读者写作;他可能希望他的读者对 Python 或 Ruby 有足够的了解,从而能够识别这类事情。所以他使用的是一种约定,而不是 Java 约定。

在这里,Bob 大叔在他引入的工厂实例方法上加了下划线。看起来他并不打算公开这些方法(它们只对子类和同一包中的类可见),他的工厂的子类将必须实现它们,但包外的代码将看不到它们。他还想为工厂方法使用与公共(public)静态方法相同的名称,但他需要一个约定来保持它们的直截了当。我认为他正在尝试将内部工厂的实例方法与公开的静态方法混淆的可能性降至最低,而不为工厂引入单独的接口(interface)。

关于java - 干净的代码——以下划线开头的 protected 方法的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24960385/

相关文章:

java - Grails Spring Security 核心 - 自定义用户信息?

java - 从日历中获取日期之前的 18 年

java - 使用 IN 子句优化 Oracle 查询

java - 自定义 ListView setOnItemClickListener 不起作用

java - Bouncy caSTLe 分离签名更改 API

java - 从目录选择器获取列表时,如何使用按钮更新 ListView ?

Java 按代码点 (UTF-32) 顺序对字符串进行排序

java - 我可以在没有任何 API 的情况下通过 Android 应用程序执行此代码吗?

java - 无法使用Tomcat和Maven的tomcat7-websocket插件启动WebSocket容器

java - 如何创建返回字符串长度的用户定义方法?