0

Xóa Ngay 40% Lượng Code Của Bạn: 8 Pattern Cực Đỉnh Để Refactor Logic Python

Nhiều developer vẫn mang một ảo tưởng rằng: code càng dài thì mức độ kiểm soát hệ thống càng tốt — giống hệt như thời đi học nghĩ rằng viết văn càng dài thì cô giáo chấm điểm càng cao vậy. Trên thực tế, những câu lệnh check điều kiện thừa thãi, mớ code boilerplate (code rập khuôn) nặng nề và các hàm lồng nhau chồng chéo chính là cội nguồn khiến hệ thống trở nên khó bảo trì và tìm bug chậm như rùa.

image.png

Các dev "lão làng" (Senior) luôn ưu tiên việc viết code súc tích và có trách nhiệm rõ ràng. Bằng cách áp dụng 8 pattern lập trình Python dưới đây, bạn có thể loại bỏ triệt để sự dư thừa của code và nâng cấp khả năng bảo trì của dự án lên một tầm cao mới.

1. Dùng dataclasses thay vì tự tạo Class thủ công

Khi khởi tạo các object để lưu trữ dữ liệu, cách viết class truyền thống đòi hỏi bạn phải code tay những method nhàm chán như __init__ hay __repr__. Điều này tạo ra rất nhiều dòng code lặp đi lặp lại.

Cách cũ (Cồng kềnh):

class Product:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock

    def __repr__(self):
        return f"Product(name={self.name}, price={self.price}, stock={self.stock})"

Cách mới (Chuẩn bài):

from dataclasses import dataclass

@dataclass
class Product:
    name: str
    price: float
    stock: int

Với decorator @dataclass, Python sẽ tự động "hô biến" ra các method khởi tạo và hiển thị object cho bạn. Code vừa ngắn vừa thể hiện rõ ý đồ: Class này sinh ra chỉ để chứa data.

2. Làm "phẳng" Logic bằng Early Return (Return sớm)

Những câu lệnh if lồng nhau sâu hun hút thường được dân mạng trêu là "Địa ngục lồng nhau" (Callback Hell / Arrow Code). Việc áp dụng pattern Early Return (Return sớm để thoát hàm) sẽ giúp luồng chạy chính của bạn luôn bám sát lề trái, tăng khả năng đọc hiểu lên gấp bội.

Cách cũ:

def process_payment(account):
    if account is not None:
        if account.is_active:
            if account.balance >= 100:
                return execute_transaction(account)
    return False

Cách mới:

def process_payment(account):
    if not account or not account.is_active:
        return False
    
    if account.balance < 100:
        return False

    return execute_transaction(account)

3. Thay thế Vòng lặp bằng Comprehension

List và Dictionary Comprehension mang đến một phong cách lập trình khai báo (declarative) cực kỳ thanh lịch. Thay vì khởi tạo một mảng rỗng rồi dùng vòng lặp để append từng phần tử, Comprehension mô tả trực tiếp luôn quá trình biến đổi dữ liệu đó.

Cách cũ:

prices = [10, 25, 40, 60]
expensive_prices = []
for p in prices:
    if p > 30:
        expensive_prices.append(p * 0.9)

Cách mới:

prices = [10, 25, 40, 60]
expensive_prices = [p * 0.9 for p in prices if p > 30]

4. Hãy để Python "Gào thét" khi có lỗi (Fail Loudly)

Cẩn thận (Defensive programming) là tốt, nhưng cẩn thận quá thì lại dở. Việc rải rác các câu lệnh check if key in data hay bọc try-except rỗng ở khắp nơi thường sẽ che giấu đi những lỗi logic thực sự.

Cách cũ:

def get_config(settings, key):
    if key in settings:
        return settings[key]
    return None

Cách mới:

def get_config(settings, key):
    return settings[key]

Cứ truy cập trực tiếp vào Key. Nếu Key đó không tồn tại, việc để chương trình ném ra lỗi KeyError sẽ giúp bạn ngay lập tức khoanh vùng được cấu hình bị thiếu trong lúc dev, thay vì lẳng lặng truyền một giá trị None chui tọt vào sâu bên trong logic nghiệp vụ.

5. Dẹp bỏ việc Check Key với defaultdict

Khi đếm tần suất xuất hiện hoặc gom nhóm dữ liệu, việc phải check tay xem một key đã tồn tại trong dict hay chưa trước khi cộng dồn là một thao tác vừa phiền phức vừa dễ sinh lỗi.

Cách cũ:

logs = ["error", "info", "error", "debug"]
counts = {}
for level in logs:
    if level not in counts:
        counts[level] = 0
    counts[level] += 1

Cách mới:

from collections import defaultdict

logs = ["error", "info", "error", "debug"]
counts = defaultdict(int)
for level in logs:
    counts[level] += 1

defaultdict sẽ tự động khởi tạo giá trị mặc định cho một key bị thiếu (ví dụ mặc định là 0 đối với kiểu int), giúp bạn quét sạch mấy nhánh if/else dư thừa.

6. Đơn giản hóa việc check điều kiện với any()all()

Bạn không cần phải tự tay duy trì mấy cái biến cờ (boolean flag) và lệnh break khi muốn kiểm tra xem có phần tử nào trong collection thỏa mãn điều kiện hay không.

Cách cũ:

orders = [order1, order2, order3]
has_pending = False
for o in orders:
    if o.status == "pending":
        has_pending = True
        break

Cách mới:

has_pending = any(o.status == "pending" for o in orders)

7. Gộp các Iterable (Mảng/List) bằng zip()

Khi cần xử lý đồng thời hai hoặc nhiều list có liên quan với nhau, việc dùng index i để tra cứu trông rất "cùi bắp" và dễ gây ra lỗi vượt quá giới hạn mảng (out of bounds).

Cách cũ:

headers = ["ID", "Name"]
rows = [101, "Alice"]
data = {}
for i in range(len(headers)):
    data[headers[i]] = rows[i]

Cách mới:

data = dict(zip(headers, rows))

Hàm zip() sẽ ghép các phần tử từ nhiều iterable lại thành một luồng (stream) các tuple, giúp bạn né hoàn toàn việc phải hardcode độ dài (length) hay check index.

8. Lọc trùng lặp (Deduplication) siêu tốc với set()

Lọc bỏ các phần tử trùng lặp là một bài toán cực kỳ phổ biến. Việc tận dụng tính chất toán học của set (tập hợp) sẽ mang lại tốc độ chạy nhanh theo cấp số nhân và code sạch hơn gấp ngàn lần so với việc dùng vòng lặp thủ công.

Cách cũ:

tags = ["python", "code", "python", "dev"]
unique_tags = []
for t in tags:
    if t not in unique_tags:
        unique_tags.append(t)

Cách mới:

unique_tags = list(set(tags))

Tiếp sức cho Code bằng một Môi trường hiệu quả

Làm chủ các pattern code trên là cực kỳ quan trọng, nhưng một không gian làm việc (workspace) hiệu quả cũng quan trọng không kém. Dev nào cũng hiểu một chân lý: giải quyết xung đột version và hì hục cấu hình Path biến môi trường giữa các project khác nhau là một cái hố đen hút cạn thời gian.

Đây chính xác là lúc việc dựa vào một trình quản lý môi trường Python chuyên dụng sẽ làm thay đổi cuộc chơi. Các công cụ như ServBay cho phép bạn cài đặt Python chỉ với một cú click chuột, bỏ qua hoàn toàn những cơn đau đầu khi phải compile thủ công hay config $PATH.

image.png

Quan trọng hơn, nó hỗ trợ chạy song song nhiều phiên bản Python cùng lúc. Cho dù bạn đang phải maintain một cái app Legacy cũ rích hay nâng cấp một project mới tinh lên tech stack mới nhất, bạn có thể switch môi trường trong chớp mắt mà không sợ gây xung đột toàn bộ hệ thống máy tính.

Cách tiếp cận quản lý môi trường cách ly và hợp nhất này đảm bảo bạn có thể dồn toàn bộ năng lượng vào việc tối ưu hóa logic code thực sự, thay vì phải đóng vai trò Sysadmin (quản trị viên hệ thống) trên chính chiếc laptop của mình.

Lời kết

Quy tắc vàng trong giao tiếp cũng đúng y xì đúc trong việc viết code: bạn càng nói (viết) nhiều, tỷ lệ mắc lỗi càng cao. Code bạn viết ra càng ít, chỗ trốn cho bug càng thu hẹp lại, và hệ thống của bạn sẽ càng dễ maintain hơn. Hãy giữ cho nó đơn giản, giữ cho nó "phẳng", và để Python làm những phần việc nặng nhọc giùm bạn.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí