Парадигмы программирования — это теории или идеи, которые помогают формировать различные языки, которые вы используете для создания программного обеспечения. Они представляют собой основные характеристики языка программирования, определяющие его поведение.
Поэтому можно с уверенностью сказать, что парадигма так же важна, как синтаксис и семантика языка программирования. Большинство популярных языков программирования используют один из нескольких типов парадигмы программирования.
1. Императивное программирование
Императивная парадигма — один из самых ранних подходов к программированию, появившийся еще в 1950-х годах. Эта парадигма сильно зависит от использования переменных, команд и процедур.
Императивное программирование использует команды для проверки и обновления переменных, сохраняя состояние в программе. Затем комбинация команд создает процедуру. Абстракция данных играет решающую роль в представлении данных, что облегчает слабую связь.
Одним из самых популярных языков, использующих императивную парадигму, является C. Этот язык программирования поддерживает только функциональные процедуры.
Пример императивной программы
#include <stdio.h>
#include <string.h>struct Customer
{
int CustomerId;
char OrderNumber[20];
char Name[30];
float OrderTotal;
};void main ()
{
struct Customer John = {4000, «HK1001», «John Doe», 200.00};
struct Customer Jane = {4001, «HK1002», «Jane Doe», 600.00};memcpy(Jane.Name , «Jane Jones», 10);
printf («The total cost for %s order number %s is: $%.2f»,Jane.Name, Jane.OrderNumber, Jane.OrderTotal);
}
Приведенная выше программа на C создает структуру Customer. Тип struct — яркий пример абстракции данных в C.
Программа демонстрирует, как команды могут создавать, обновлять и отображать состояние — с помощью структурной переменной Jane. Все эти команды находятся в функции main(), которая в целом представляет собой процедуру, определяющую, сколько денег клиент должен заплатить за заказ.
Выполнение приведенной выше программы приведет к следующему выводу в вашей консоли:
The total cost for Jane Jones order number HK1002 is: $600.00
2. Объектно-ориентированное программирование
Парадигма объектно-ориентированного программирования зародилась в 1990-х годах. Эта парадигма является потомком императивной. Однако объектно-ориентированная парадигма хранит состояние в объектах, а не в переменных.
Языки программирования, использующие объектно-ориентированную парадигму, часто лучше справляются со сложными приложениями. Основными функциями парадигмы являются объекты, классы, инкапсуляция данных, наследование и полиморфизм.
Класс — это основной компонент объектно-ориентированной программы. Некоторые классы наследуют свойства и операции от других классов. Программисты описывают это как отношения родитель-потомок. Он подпадает под категорию полиморфизма подтипа.
Классы содержат инструменты для скрытия и защиты конфиденциальных данных посредством инкапсуляции. После того как вы определили класс, вы можете использовать его для создания объектов.
Тремя наиболее популярными языками программирования, использующими объектно-ориентированную парадигму, являются Java, C++ и Python.
Пример объектно-ориентированной программы
Это приложение демонстрирует большинство возможностей объектно-ориентированного языка программирования Java. Определенный тип клиентов наследует поведение от более общего типа. Все клиенты реализуют интерфейс. Конкретный тип клиента переопределяет метод из интерфейса.
Файл Discountable.java
public interface Discountable {
public void grandTotal(String orderNumber, double total);
}
Приведенный выше код создает интерфейс. В Java интерфейс является еще одним примером полиморфизма. Он позволяет сущностям, не связанным напрямую, получать доступ к одним и тем же свойствам, например метод grandTotal. Это приложение ориентировано на клиентов, но класс сотрудников также может использовать интерфейс Discountable.
Файл Customer.java
public class Customer implements Discountable {
protected int customerId;
protected String customerName;
protected String customerCode;public Customer() {
this.customerId = 0;
this.customerName = «»;
this.customerCode = «»;
}public Customer(int customerId, String customerName, String customerCode) {
this.customerId = customerId;
this.customerName = customerName;
this.customerCode = customerCode;
}public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerCode() {
return customerCode;
}public void setCustomerCode(String customerCode) {
this.customerCode = customerCode;
}public double customerType(String customerCode) {
double discount = 0;if (customerCode.toLowerCase().equals(«pre»)) {
discount = 0.10;
} else if (customerCode.toLowerCase().equals(«gen»)) {
discount = 0.02;
} else if (customerCode.toLowerCase().equals(«new»)) {
discount = 0.05;
}
return discount;
}@Override
public void grandTotal(String orderNumber, double total) {double discount = customerType(customerCode);
double discountPercentage = total * discount;
double finalTotal = total — discountPercentage;System.out.println(«For «+ getCustomerName() + » order Number » + orderNumber + » the grand total is: $» + finalTotal);
}}
Приведенный выше код создает класс Customer. Он реализует интерфейс Discountable, а затем использует свой метод для расчета и отображения общей суммы на основе категории клиента. Ключевое слово protected в приведенном выше коде является примером инкапсуляции данных; он ограничивает доступ к данным, созданным с помощью этого класса. Таким образом, только подклассы (или дочерние классы) класса Customer будут иметь доступ к его данным.
Файл NewCustomer.java
public class NewCustomer extends Customer {
public NewCustomer() {
super();
}public NewCustomer(int customerId, String customerName, String customerCode) {
super(customerId, customerName, customerCode);
}}
Приведенный выше код создает класс NewCustomer, расширяющий класс Customer. Этот класс Java использует наследование для представления отношения родитель-потомок с классом Customer. NewCustomer является дочерним в отношении, поэтому он имеет доступ ко всем свойствам класса Customer. Он импортирует атрибуты класса Customer, используя метод super().
Файл App.java
public class App {
public static void main(String[] args) {
Customer Jane = new NewCustomer(4001, «Jane Jones», «new»);
Jane.grandTotal(«HK1002», 600);
}
}
Приведенный выше код создает исполняемый класс приложения. Этот класс создает объект Customer (Джейн) и с помощью полиморфизма делает Джейн NewCustomer. Наконец, он генерирует общую сумму заказа Джейн. Выполнение приведенной выше программы сгенерирует следующий вывод в консоли:
For Jane Jones order Number HK1002 the grand total is: $570.0
3. Функциональное программирование
Ключевыми понятиями этой парадигмы являются выражения, функции, параметрический полиморфизм и абстракция данных. Выражения являются фундаментальными компонентами функций, используемых языками функционального программирования. Параметрический полиморфизм является одним из трех типов полиморфизма. Этот тип упрощает универсальное программирование с помощью функций и типов.
JavaScript — один из самых популярных языков функционального программирования.
Пример функциональной программы
const Customer = {
IdNumber: 1002,
Name: ‘Jane Jones’,
CustomerCode: ‘new’
}const main = (customer, func, value) => {
var total = func.apply(null, [ customer.CustomerCode, value ]);
console.log(`${customer.Name} total is: ${total}`);
}const grandTotal = (CustomerCode, total) => {
if (CustomerCode == «new») {
discount = total * 0.05;
mainTotal = total — discount;
return mainTotal;
} else if (CustomerCode == «pre») {
discount = total * 0.10;
mainTotal = total — discount;
return mainTotal;
}
}main(Customer, grandTotal, 600);
Программа JavaScript выше имеет литерал объекта и две функции. Он объявляет каждую из функций как выражение, используя стрелочную функцию JavaScript. Функция main() является функцией более высокого порядка. Он принимает функцию grandTotal в качестве одного из своих аргументов, а затем вызывает эту функцию. Это также пример параметрического полиморфизма.
Функция grandTotal() содержит несколько выражений, а объект Customer является примером абстракции данных. Вышеприведенная программа генерирует следующий вывод в консоли:
Jane Jones total is: $570
Сложность языков программирования
Язык программирования может воплощать концепции одной парадигмы программирования, но это не означает, что он ограничен одной парадигмой. Многие популярные языки программирования (такие как Python, Java, JavaScript и C++) являются языками с несколькими парадигмами.
Некоторые парадигмы программирования, такие как императивная и объектно-ориентированная парадигмы, также связаны между собой. Но, несмотря на это родство, есть и существенные различия.