DEV Community

Cover image for Programming Fundamentals: Getting Started with Programming Paradigms
Clifford Silla
Clifford Silla

Posted on

Programming Fundamentals: Getting Started with Programming Paradigms

Programming paradigms are a way to classify programming languages based on their features and the way they approach problem-solving. A programming paradigm is a set of rules or guidelines that govern how a program is written and structured.

There are several programming paradigms, and some programming languages support multiple paradigms. Here are some of the most common programming paradigms:

Object-Oriented Programming (OOP)

OOP is a programming paradigm that organizes code into objects that have properties and methods. An object is an instance of a class, which is a blueprint for creating objects.

Let's consider an example of a simple bank account system. Here's an example of a BankAccount class in Python

class BankAccount:
  def __init__(self, balance=0):
    self.balance = balance

  def deposit(self, amount):
    if amount > 0:
      self.balance += amount
      return True
    else:
      return False

  def withdraw(self, amount):
    if amount <= self.balance:
      self.balance -= amount
      return True
    else:
      return False

  def get_balance(self):
    return self.balance
Enter fullscreen mode Exit fullscreen mode

In this example, we define a BankAccount class that has four methods:

init: This is a special method that is called when a new object is created. It takes two arguments: self, which is a reference to the object itself, and balance, which is the initial balance of the account.
deposit: This method takes an argument amount and adds it to the balance if it's greater than zero. It returns True if the deposit was successful, and False otherwise.
withdraw: This method takes an argument amount and subtracts it from the balance if it's less than or equal to the balance. It returns True if the withdrawal was successful, and False otherwise.
get_balance: This method returns the current balance of the account.
Now, let's create an instance of the BankAccount class:

my_account = BankAccount(100)
Enter fullscreen mode Exit fullscreen mode

In this example, we create a new BankAccount object with an initial balance of 100. We can now use the methods of the BankAccount class to interact with the object:

my_account.deposit(50)
my_account.withdraw(25)
print(my_account.get_balance()) # Output: 125
Enter fullscreen mode Exit fullscreen mode

In this example, we deposit 50 to the account, withdraw 25 from the account, and print the current balance.

OOP allows us to encapsulate data and behavior into objects, making it easier to manage complex systems. By organizing code into objects, we can reuse code, reduce redundancy, and make our code more modular and maintainable.

Functional Programming (FP)

This paradigm emphasizes the evaluation of mathematical functions and avoids changing the state and mutable data. It encourages the use of pure functions, which are functions that given the same input, will always return the same output and do not have any observable side effects. Functional programming languages include Haskell, Lisp, and Erlang. Here is an example of functional programming in Python.

def add_five(x):
  return x + 5

result = add_five(3)
print(result) # Output: 8
Enter fullscreen mode Exit fullscreen mode

In this example, we define a function add_five that takes a single argument x and returns the result of adding 5 to x. We then call the function with an argument of 3 and print the result.

Procedural Programming(PP)

This paradigm emphasizes the use of procedures or routines to perform tasks. It focuses on the sequence of steps executed by the program and the data used in those steps. Procedural programming languages include C, Fortran, and COBOL. Here is an example of procedural programming in Python.

def print_numbers(n):
  for i in range(n):
    print(i)

print_numbers(5)
# Output:
# 0
# 1
# 2
# 3
# 4
Enter fullscreen mode Exit fullscreen mode

In this example, we define a function print_numbers that takes a single argument n and prints the numbers from 0 to n-1. We then call the function with an argument of 5 and print the result.

Imperative Programming (IP)

This paradigm emphasizes the direct manipulation of data and the use of statements that change the state of the program. It focuses on the commands that modify the program's state and the data used in those commands. Imperative programming languages include C, Fortran, and COBOL. Here is an example of Imperative Programming in Python.

def add_five_ip(x):
  result = x + 5
  return result

x = 3
result = add_five_ip(x)
print(result) # Output: 8
Enter fullscreen mode Exit fullscreen mode

In this example, we define a function add_five_ip that takes a single argument x, adds 5 to it, and stores the result in a variable result. We then return the result. We then create a variable x with a value of 3, call the function with x as an argument, and print the result.

Declarative Programming (DP)

This paradigm emphasizes the description of the desired result without specifying the steps required to achieve it. It focuses on the what rather than the how. Declarative programming languages include SQL, Prolog, and HTML. Here is an example of declarative programming in SQL;

SELECT name, age FROM employees WHERE department = 'Sales';
Enter fullscreen mode Exit fullscreen mode

In this example, we describe the desired result: we want to retrieve the names and ages of all employees in the Sales department. We don't specify how to retrieve this information or how to filter the results.

Logic Programming (LP)

This paradigm emphasizes the use of logical statements to express facts and rules about a problem domain. It focuses on the relationships between concepts and the inferences that can be drawn from those relationships. Logic programming languages include Prolog and Mercury. Here is an example of logic programming in Prolog.

parent(john, jim).
parent(jim, ann).
parent(jim, brian).

male(john).
male(brian).

father(X) :- male(X), parent(X, Y).

grandparent(X) :- parent(X, Z), parent(Z, Y).

?- father(X).
?- grandparent(jim).
Enter fullscreen mode Exit fullscreen mode

In this example, we define a set of facts (e.g., parent(john, jim) means that John is the parent of Jim) and rules (e.g., father(X) :- male(X), parent(X, Y) means that X is a father if X is male and X is a parent of Y). We then ask Prolog to find all solutions for the queries father(X) and grandparent(jim).

Reactive Programming (RP)

This paradigm emphasizes the use of event-driven programming, where the program responds to events or changes in data. It focuses on the dynamic behavior of the program and the interactions between components. Reactive programming languages include React, Angular, and Vue.js. Here's an example of reactive programming in JavaScript using the RxJS library:

const { of } = require('rxjs');

const source = of(1, 2, 3, 4, 5);
const example = source.pipe(
  map(x => x * 2),
  filter(x => x % 3 === 0),
  reduce((acc, x) => acc + x, 0)
);

const subscribe = example.subscribe(val => console.log(val));
Enter fullscreen mode Exit fullscreen mode

In this example, we define a source of data (an observable that emits the numbers 1 through 5) and a series of operators that transform the data (e.g., map multiplies each value by 2, filter keeps only values that are divisible by 3, and reduce sums up the values). We then subscribe to the resulting observable and print the result. When the source emits a value, the operators are applied in sequence, and the result is printed to the console.

Understanding programming paradigms can help programmers choose the right tool for the job and write more effective and maintainable code. Different paradigms have different strengths and weaknesses, and choosing the right one for a particular task can make a big difference in the quality and maintainability of the code.

Top comments (0)