DEV Community

Paul AJadi
Paul AJadi

Posted on

Writing Clean, Efficient, and Maintainable Code - Python as use case.

Writing Clean, Efficient, and Maintainable Code - Python as use case.
If you have been a developer for some time, you may understand the importance of proper coding as against the rush of just writing somthings that works. One of the greatest setback this has for you is when you need to review your code you rarely can make sense of what you were trying to do and for others, they have a hard time reading your code. 

I recently have been reviewing some codes and I think it is important to stress the need to clean, efficien code.

Some history to guidelines and styles in coding

In the early 1970's when the C Programming language was gaining popularity coding style become a matter of discussion and two notable names around this were Brian Kernighan and Dennis Ritchie.

Interestingly, Ada language enforced strict coding guidelines and standards in the rearly 1980's. Mid 1990's Python and Java came in with strong coding conventions from the initial phase and Python Enhancement Proposal (PEP 8) was well adopted which today is still a valid coding convention.

  1. PEP 8 Guidelines for Code Styling: I have used this guideline everynow and then and I have seen other programmers adopt this. 

VS Code's flake8 code linting extension is a great choice I use. 
The guidelines are:
Indentation: Use 4 spaces per indentation level.
Line Length: Limit all lines to a maximum of 79 characters.
Naming Conventions: Use snake_case for function and variable names and CamelCase for class names.

For example:

`# defining variables using snake_case

total_price = 100
customer_email = "customer@example.com"

# defining functions using snake_case
def calculate_total_price():
    pass

class OrderManager:
    pass`
Enter fullscreen mode Exit fullscreen mode

2. Meaningful comments and documentations: Docstrings helps developers understand a function/methods purpose, paramters and return values. It is generally good practice to introduce them and writing comments to clarify a complex logic or decision
For example:

def calculate_total_price(price: float, quantity: int) -> float:
    """
    Calculate the total price of items.

    Args:
        price (float): The price of a single item.
        quantity (int): The number of items purchased.

    Returns:
        float: The total price.
    """
    return price * quantity
Enter fullscreen mode Exit fullscreen mode

**3. Code Repititions: **As a simply rule of thumb avoid repeating a code that's already implemented, instead follow the DRY principle by making reusable functions. The caveat to this is, when a new developer implements a change, the developer might not know there is a duplicated code that has been left out and can mess with a whole lot owing to this error.

For example, you have a function that calculates total price for an ecommerce store by multiplying the price and quantity.

 

total_price_laptops = 1000 * 2
total_price_phones = 500 * 3
This, is easily done with reusable functions like this:
def calculate_total(price, quantity):
    return price * quantity

total_price_laptops = calculate_total(1000, 2)
total_price_phones = calculate_total(500, 3)
Enter fullscreen mode Exit fullscreen mode

4. Type Hints: Python is dynamically typed language, type hinting your code improve readability and catch errors early. It is easier to understand what data types are expected.

For example:

def get_discounted_price(price: float, discount: float) -> float:
    return price - (price * discount)
Enter fullscreen mode Exit fullscreen mode

**5. Writing Tests: **Tests validate the functionality of your code. Popular frameworks like unittest or pytest make writing and running tests simple. Testing asserts that your code behaves as expected, reducing the risk of introducing bugs when making changes or refactoring.

def test_calculate_total_price():
    assert calculate_total_price(100, 2) == 200
Enter fullscreen mode Exit fullscreen mode

6. Exceptions: It can be embarassing when production codes print out lines of meaninglesss code to client users or even worse, output environmental variables. Avoiding this is easier with exception try/except/finally handling to manage predictable errors and ensure your application doesn't crash unexpectedly.

try:
    value = int(input("Enter a number: "))
except ValueError:
    print("That's not a valid number!")
finally:
    print('Thank you!')
Enter fullscreen mode Exit fullscreen mode

7. Code Modularization: There is no rule that says to keep your codes in one file. Break down large blocks of code into smaller, reusable modules and import them across the application where neede. It is easier to test and update.

8. Version Control: Version control systems like Git is a fundamental best practice in modern development. Others are Beanstalk, PerForce, Apache subversion. Version controls can track changes, reduce human errors during collaborations and unintended consequences to a great extent.

By following best practices like adhering to PEP 8, keeping your code DRY, writing meaningful documentation, and handling exceptions gracefully, you can ensure that your Python projects are professional, scalable, and easy to maintain. 
Start implementing these tips today, and you'll see a noticeable improvement in the quality of your code.

Top comments (0)