Каково обоснование использования спецификации доступа для метода / поля?

В C++ спецификатор доступа для поля или метода основан на его расположении в соответствии с первой ранее объявленной спецификацией доступа:

public:
  int my_public_variable;
private:
  void secretPrivateOperations();
  int internal_counter;

Каково логическое обоснование разработки Java, определяющего доступ путем добавления спецификатора доступа к каждому методу / полю?

public int my_public_variable;
private void secretPrivateOperations();
private int internal_counter;

2 ответа

Чтобы добавить в awksp ответ, давайте рассмотрим короткий пример. Довольно часто у вас есть открытые методы API, реализованные с закрытыми методами, которые вы не хотите показывать. Чаще всего вы хотите, чтобы код этих методов был близок друг к другу, чтобы облегчить чтение кода, а если нет, вот как он может выглядеть:

public:
    void api1() { 
        do_some_stuff();
        private_method();
        some_other_stuff();
    }

   void api2() {
        do_something();
   }

   int api3() {
        int i = a_computation();
        return i + A_CONSTANT;
   }

private:    
   void private_method() {
        do_clever_stuff();
        api1_implementation_details();
   }

Это не здорово читать, private_method далеко не единственный метод, который использует его, api1, Такое публичное / частное разделение кода не имеет никакого логического смысла. Вы хотите, чтобы ваш код был организован по его логике, а не по видимости методов.

Я очень предпочитаю видеть это:

// I can read the whole logic of this method without any clutter
public void api1() { 
   do_some_stuff();
   private_method();
   some_other_stuff();
}

private void private_method() {
   do_clever_stuff();
   api1_implementation_details();
}
// and so on...

Для сравнения:

public:
    T a();
    T b();
    ...
    T z();

против

public:
    T a() {
        <lots of code>
    }
    T b() {
        <lots of code>
    }
protected:
    T c() {
        <more code>
    }
public:
    T d() {
        <more code>
    }

Если вы "исключите" спецификаторы доступа, как это, все может стать довольно неприятным довольно быстро. Да, отступ помогает. Да, у вас есть Ctrl-F. Но все еще может быть много шума для просмотра (например, многотысячные строковые файлы), и необходимость отвлечься от своей задачи, просто искать подобные вещи, вероятно, не поможет производительности.

Java и C++ Java справляется с этим по-разному. Java сохраняет спецификаторы доступа локальными, поэтому для определения области действия достаточно знать, над каким методом вы работаете. C++ объединяет объявления, так что спецификатор доступа может быть "разложен". Это может быть не так хорошо при реализации методов, но в заголовочных файлах оно гораздо лаконичнее, и, возможно, его проще поймать.

Другие вопросы по тегам