#java #procedural-programming
Вопрос:
В настоящее время я изучаю Java для своего модуля процедурного программирования. Я читал, что в процедурном программировании записи должны быть определены вне основного класса, но методы доступа к этим записям должны быть определены в основном классе.
Пример показан ниже:
class person // Record definition
{
String name;
int age;
}
class personalDetails // Main class
{
public static void main (String [] a)
{
mainMethod();
System.exit(0);
}
public static void mainMethod()
{
// Main method
}
// Getter method to get name
public static String getName(person p)
{
return p.name;
}
// Getter method to get age
public static int getAge(person p)
{
return p.age;
}
// Setter method to set name
public static void setName(person p, String name)
{
p.name = name;
}
// Setter method to set age
public static void setAge(person p, int age)
{
p.age = age;
}
}
Почему это необходимо?
Я знаю, что мы не можем определить методы доступа в определении записи, поскольку это подход ООП, но я не совсем понимаю, почему мы не можем определить запись в основном классе, в котором находятся методы доступа.
Комментарии:
1. Я должен сказать, что выбор Java для курса по процедурному программированию-странный выбор. Но если это то, что они сделали, то ответ на ваш вопрос прост: они не делают то, что вы предлагаете, потому что это было бы ООП, а не процедурно. Лучшее, что вы можете получить в процедурном программировании на Java, — это то, что вы показываете: классы без какого-либо кода, только с полями и статическими методами для управления ими.
2. «Я читал, что в процедурном программировании записи должны определяться вне основного класса…» У вас нет занятий по процедурному программированию.
3. Спасибо за объяснение, но почему это стиль ООП, если мы определяем запись в основном классе? Какая разница, если он будет снаружи?
4. Я не думаю, что это «стиль ООП»: определите класс, в котором он наиболее подходит. Но, учтите, основной класс подобен водителю автомобиля: они заставляют автомобиль двигаться; основной класс «управляет» другим кодом. Однако вы не строите машину внутри водителя.
5. » почему мы не можем определить запись в основном классе, в котором находятся методы доступа». Ты мог бы. Однако он должен быть объявлен статическим, иначе Java будет неявно захватывать ссылку на заключающий класс. Опять же, это пример того, почему выбор Java для процедурного кода на самом деле является квадратным колышком, круглым отверстием. Его значения по умолчанию основаны на ожиданиях, что вы будете использовать ООП. Процедурный язык действительно должен, по крайней мере, иметь понятие свободных функций.
Ответ №1:
В «традиционном» процедурном программном коде код и данные, с которыми он работает, совершенно разные: у вас есть структуры данных, которым не присвоен какой-либо код, и у вас есть код, который не имеет возможности хранить код.
В Java они смешиваются: весь код и все данные имеют некоторое отношение к классам (я также включаю интерфейсы, перечисления и записи в это определение, для этого различие не важно): методы являются частью класса, а поля также принадлежат классам.
Таким образом, в обычном стиле Java вы бы определили поля типа вместе с методами, которые действуют на него:
class Person {
String name;
int age;
// omitting constructors
public String getDescription() {
return name " is " age " years old.";
}
}
Здесь вы четко объединяете как данные (поля name
и age
), так и код (метод getDescription
) в единое целое.
В процедурном программировании эти две вещи были бы отдельными (здесь я использую синтаксис в стиле Java, но тот точный код, который я показываю, не является допустимым Java).
type Person {
String name;
int age;
}
String getDescription(Person p) {
return p.name " is " p.age " years old.";
}
Методы, которые не относятся ни к какому типу, невозможны в Java, поэтому, чтобы приблизиться к этому, вам придется поместить их в класс (на самом деле в любой класс).:
class Person {
String name;
int age;
}
class PersonMethods {
static String getDescription(Person p) {
return p.name " is " p.age " years old.";
}
}
Обратите также внимание, что я создал метод static
, указывающий, что он не действует на экземпляр PersonMethods
. Это еще один признак того, что мы используем Java для реализации модели программирования, для реализации которой она не предназначена.
Где именно находятся эти методы, на самом деле не имеет значения. Теоретически вы могли бы даже поместить их в Person
себя и сохранить их static
с Person p
параметром, но это, вероятно, было бы слишком похоже на обычное ООП.