Процедурное и объектно-ориентированное программирование - Вопросы
Всего: 6 вопросов
1. Что такое процедурное программирование?
Что такое процедурное программирование?
Процедурное программирование — это методика, при которой программа описывается как последовательность инструкций, выполняемых сверху вниз, а порядок выполнения меняют ветвления (if, switch) и циклы (for, while). Повторяющиеся куски кода выносят в подпрограммы — процедуры, функции или, в Java, методы. Данные при этом живут отдельно от кода: есть переменные, и есть методы, которые принимают их параметрами и возвращают результат. Подход, дополненный правилом «только последовательность, ветвление и цикл, без goto», называют структурным программированием.
2. Что такое объектно-ориентированное программирование и чем оно отличается от процедурного?
Что такое объектно-ориентированное программирование и чем оно отличается от процедурного?
ООП — методика программирования, в которой основными понятиями являются объект и класс. Прежде чем писать инструкции, в задаче выделяют объекты и описывают их классами: в классе задают характеристики объекта (поля) и его поведение (методы).
Ключевое отличие от процедурного подхода: в ООП данные и работающий с ними код объединены в одном месте, а доступ к данным закрыт инкапсуляцией (private + публичные методы). В процедурном стиле данные и методы разделены, и любое изменение структуры данных заставляет править все методы, которые с ними работают. В ООП изменение обычно локализовано в одном классе.
3. Java — процедурный или объектно-ориентированный язык?
Java — процедурный или объектно-ориентированный язык?
Java — объектно-ориентированный язык: метод нельзя объявить вне класса, а почти вся стандартная библиотека построена на классах и интерфейсах. При этом писать на Java процедурный код никто не мешает: инструкции внутри static void main выполняются сверху вниз так же, как в программе на C, а класс служит лишь контейнером.
Полностью объектно-ориентированным Java тоже не является: примитивные типы (int, double, boolean) объектами не являются, а static-методы вызываются без создания экземпляра. Какая парадигма используется на практике, решает ваш дизайн, а не компилятор.
4. Какие языки называют процедурными и почему деление языков на процедурные и объектно-ориентированные условно?
Какие языки называют процедурными и почему деление языков на процедурные и объектно-ориентированные условно?
Процедурный язык программирования — язык, в котором базовой единицей построения программы является процедура (функция), а не объект. Классические примеры: C (системное программирование, ядро Linux), Pascal (создан для обучения структурному программированию), Fortran (научные расчёты), COBOL (банковские и учётные системы), а также BASIC, Ada и Go — Go поддерживает методы у типов, но не имеет классов и наследования.
Деление условно, потому что большинство современных языков мультипарадигменные: на C++, Python, JavaScript и PHP можно писать и процедурно, и объектно-ориентированно. Java ближе всего к чисто объектно-ориентированным языкам, но и на ней несложно написать процедурный код.
5. Когда процедурного стиля достаточно и по каким признакам пора переходить к объектам?
Когда процедурного стиля достаточно и по каким признакам пора переходить к объектам?
Если задача укладывается в десяток строк — вычислить факториал, отсортировать массив, распарсить строку, — процедурного стиля достаточно. Класс без состояния с единственным методом обычно не нужен: это лишний слой без пользы. Процедурный стиль уместен в скриптах, расчётах и учебных задачах, ООП — в крупных приложениях с долгой поддержкой.
Признаки того, что пора переходить к объектам: появилось несколько переменных, которые всегда передаются вместе; один и тот же набор данных обрабатывается в разных местах программы; появились варианты поведения, различающиеся типом сущности. Чтобы переписать процедурный код в объектно-ориентированный, соберите такие переменные в класс, перенесите туда методы, которые их принимали, закройте поля модификатором private и оставьте наружу только нужные вызывающему коду методы.
6. Как выглядит одна и та же задача в процедурном и объектно-ориентированном стиле на Java?
Как выглядит одна и та же задача в процедурном и объектно-ориентированном стиле на Java?
Задача: посчитать стоимость покупки. Процедурный вариант — данные лежат в переменных, метод получает их параметрами:
public class Main {
public static void main(String[] args) {
String name = "Coffee";
double price = 120.0;
int quantity = 3;
System.out.println(name + ": " + total(price, quantity));
}
static double total(double price, int quantity) {
return price * quantity;
}
}
Объектно-ориентированный вариант — данные и поведение объединены в классе Product, а цена скрыта модификатором private:
public class Product {
private final String name;
private final double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public double total(int quantity) {
return price * quantity;
}
public String getName() {
return name;
}
}
Product coffee = new Product("Coffee", 120.0);
System.out.println(coffee.getName() + ": " + coffee.total(3));
Результат одинаковый, но во втором варианте цену нельзя случайно испортить снаружи, а правило расчёта стоимости лежит рядом с данными, которые оно использует. Добавление скидки или налога потребует изменить один класс, а не все места вызова.