Tôi thực sự yêu thích mã sạch và tôi luôn muốn mã hóa mã của mình theo cách tốt nhất có thể. Nhưng luôn có một điều, tôi không thực sự hiểu:
Khi nào có quá nhiều "sự phân tách mối quan tâm" liên quan đến các phương pháp?
Giả sử chúng ta có phương pháp sau:
def get_last_appearance_of_keyword(file, keyword):
with open(file, 'r') as file:
line_number = 0
for line in file:
if keyword in line:
line_number = line
return line_number
Tôi nghĩ rằng phương pháp này là tốt như nó là. Nó đơn giản, dễ đọc và rõ ràng, tên của nó nói gì. Nhưng: Nó không thực sự làm "chỉ một điều". Nó thực sự mở tập tin, và sau đó tìm thấy nó. Điều đó có nghĩa là tôi có thể chia nó hơn nữa (Cũng xem xét "Nguyên tắc trách nhiệm duy nhất"):
Biến thể B (Chà, điều này có ý nghĩa nào đó. Bằng cách này, chúng ta có thể dễ dàng sử dụng lại thuật toán tìm sự xuất hiện cuối cùng của từ khóa trong một văn bản, nhưng nó có vẻ như "quá nhiều". Tôi không thể giải thích tại sao, nhưng tôi chỉ "cảm thấy "theo cách đó):
def get_last_appearance_of_keyword(file, keyword):
with open(file, 'r') as text_from_file:
line_number = find_last_appearance_of_keyword(text_from_file, keyword)
return line_number
def find_last_appearance_of_keyword(text, keyword):
line_number = 0
for line in text:
if keyword in line:
line_number = line
return line_number
Biến thể C (Điều này theo tôi là vô lý. Về cơ bản, chúng tôi đang gói gọn một lớp lót vào một phương thức khác chỉ với một dòng hai lần. Nhưng người ta có thể lập luận rằng cách mở một cái gì đó có thể thay đổi trong tương lai, vì một số yêu cầu tính năng và vì chúng tôi không muốn thay đổi nó nhiều lần, nhưng chỉ một lần, chúng tôi chỉ gói gọn nó và tách chức năng chính của chúng tôi hơn nữa):
def get_last_appearance_of_keyword(file, keyword):
text_from_file = get_text_from_file(file)
line_number = find_keyword_in_text(text_from_file, keyword)
return line_number
def get_text_from_file(file):
with open(file, 'r') as text:
return text
def find_last_appearance_of_keyword(text, keyword):
line_number = 0
for line in text:
if check_if_keyword_in_string(line, keyword):
line_number = line
return line_number
def check_if_keyword_in_string(text, keyword):
if keyword in string:
return true
return false
Vì vậy, câu hỏi của tôi bây giờ: cách viết mã này là đúng và tại sao các cách tiếp cận khác đúng hay sai? Tôi luôn học được: Ly thân, nhưng không bao giờ khi nó đơn giản là quá nhiều. Và làm thế nào tôi có thể chắc chắn trong tương lai, rằng nó "vừa phải" và nó không cần phải phân tách nhiều hơn khi tôi mã hóa lại?
line_number = 0
là một mặc định số và line_number = line
gán giá trị chuỗi (là nội dung của dòng không phải là vị trí của nó )
open
và in
. Thực hiện lại các chức năng hiện có không làm tăng sự tách biệt các mối quan tâm, mối quan tâm đã được xử lý trong chức năng hiện có!