【TIPS】リファクタリング ― クリーンコード ― Tip 7 ― クラスでデータと振る舞いをカプセル化

By JoeVu, at: 2024年8月15日9:45

Estimated Reading Time: __READING_TIME__ minutes

[TIPS] Refactoring - Clean Code - Tip 7 - Encapsulate Data and Behavior in Classes
[TIPS] Refactoring - Clean Code - Tip 7 - Encapsulate Data and Behavior in Classes

リファクタリング Tip 7:クラスでデータと動作をカプセル化する

  • ジュニア:クラスを活用せずに手続き型プログラミングを使用する可能性があります。

  • シニア:オブジェクト指向プログラミング(OOP)の原則に従い、関連するデータと動作をカプセル化するためにクラスを使用します。


クラスでデータと動作をカプセル化することは、整理され、保守可能なコードを作成するために不可欠です。ジュニアとシニアの開発者がこの原則にどのようにアプローチするかを示す例を次に示します。

 

例1:ユーザーデータの処理


ジュニア開発者のアプローチ

ジュニア開発者は、ユーザーデータを処理するために手続き型プログラミングを使用する可能性があります。

users = []

def add_user(name, age):
    users.append({'name': name, 'age': age})

def get_user(name):
    for user in users:
        if user['name'] == name:
            return user
    return None

def update_user(name, age):
    for user in users:
        if user['name'] == name:
            user['age'] = age

# 使用例
add_user('Alice', 30)
add_user('Bob', 25)
print(get_user('Alice'))
update_user('Alice', 31)
print(get_user('Alice'))

 

シニア開発者のアプローチ

シニア開発者は、ユーザーデータと動作をカプセル化するためにクラスを使用します。

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def update_age(self, age):
        self.age = age


class UserManager:
    def __init__(self):
        self.users = []

    def add_user(self, name, age):
        self.users.append(User(name, age))

    def get_user(self, name):
        for user in self.users:
            if user.name == name:
                return user
        return None

    def update_user(self, name, age):
        user = self.get_user(name)
        if user:
            user.update_age(age)

# 使用例
user_manager = UserManager()
user_manager.add_user('Alice', 30)
user_manager.add_user('Bob', 25)
print(vars(user_manager.get_user('Alice')))
user_manager.update_user('Alice', 31)
print(vars(user_manager.get_user('Alice')))

 

例2:図書館システムの管理


ジュニア開発者のアプローチ

ジュニア開発者は、図書館システムを管理するために手続き型プログラミングを使用する可能性があります。

books = []

def add_book(title, author):
    books.append({'title': title, 'author': author})

def get_book(title):
    for book in books:
        if book['title'] == title:
            return book
    return None

def remove_book(title):
    global books
    books = [book for book in books if book['title'] != title]

# 使用例
add_book('1984', 'George Orwell')
add_book('To Kill a Mockingbird', 'Harper Lee')
print(get_book('1984'))
remove_book('1984')
print(get_book('1984'))


シニア開発者のアプローチ

シニア開発者は、書籍データと図書館管理の動作をカプセル化するためにクラスを使用します。

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

class Library:
    def __init__(self):
        self.books = []

    def add_book(self, title, author):
        self.books.append(Book(title, author))

    def get_book(self, title):
        for book in self.books:
            if book.title == title:
                return book
        return None

    def remove_book(self, title):
        self.books = [book for book in self.books if book.title != title]

# 使用例
library = Library()
library.add_book('1984', 'George Orwell')
library.add_book('To Kill a Mockingbird', 'Harper Lee')
print(vars(library.get_book('1984')))
library.remove_book('1984')
print(library.get_book('1984'))

 

例3:注文の処理


ジュニア開発者のアプローチ

ジュニア開発者は、注文を処理するために手続き型プログラミングを使用する可能性があります。

orders = []

def add_order(order_id, amount):
    orders.append({'order_id': order_id, 'amount': amount})

def get_order(order_id):
    for order in orders:
        if order['order_id'] == order_id:
            return order
    return None

def update_order(order_id, amount):
    for order in orders:
        if order['order_id'] == order_id:
            order['amount'] = amount

# 使用例
add_order(1, 100)
add_order(2, 150)
print(get_order(1))
update_order(1, 120)
print(get_order(1))

 

シニア開発者のアプローチ

シニア開発者は、注文データと処理動作をカプセル化するためにクラスを使用します。

class Order:
    def __init__(self, order_id, amount):
        self.order_id = order_id
        self.amount = amount

    def update_amount(self, amount):
        self.amount = amount

class OrderManager:
    def __init__(self):
        self.orders = []

    def add_order(self, order_id, amount):
        self.orders.append(Order(order_id, amount))

    def get_order(self, order_id):
        for order in self.orders:
            if order.order_id == order_id:
                return order
        return None

    def update_order(self, order_id, amount):
        order = self.get_order(order_id)
        if order:
            order.update_amount(amount)

# 使用例
order_manager = OrderManager()
order_manager.add_order(1, 100)
order_manager.add_order(2, 150)
print(vars(order_manager.get_order(1)))
order_manager.update_order(1, 120)
print(vars(order_manager.get_order(1)))

 

主な改善点:

  1. カプセル化:関連するデータと動作をクラスにグループ化し、組織化と保守性を向上させます。
     
  2. モジュール性:クラス内に機能をカプセル化し、コードの理解と拡張を容易にします。
     
  3. オブジェクト指向の原則:OOPの原則に従って、再利用可能でスケーラブルなコードを作成します。
     

クラスでデータと動作をカプセル化すると、コードベースの整理、保守の容易性、およびスケーラビリティが向上します。これらの例は、シニア開発者のリファクタリングへのアプローチが、より構造化され、保守可能なコードにつながる方法を示しています。

Tag list:
- Python
- Tips
- Tips and Tricks
- Refactor Code
- Refactoring
- OOP
- Refactor Tips
- Python refactoring
- Encapsulate Data

Related

Python Optimization

Read more
Python Optimization

Read more
Python Optimization

Read more

Subscribe

Subscribe to our newsletter and never miss out lastest news.