Eu realmente amo códigos limpos e sempre quero codificá-los da melhor maneira possível. Mas sempre houve uma coisa que eu realmente não entendi:
Quando é muito "separação de preocupações" em relação a métodos?
Digamos que temos o seguinte método:
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
Eu acho que esse método está bem como está. É simples, fácil de ler e claramente mostra o que o nome diz. Mas: não está realmente fazendo "apenas uma coisa". Na verdade, ele abre o arquivo e o encontra. Isso significa que eu poderia dividir ainda mais (considerando também o "Princípio da responsabilidade única"):
Variação B (Bem, isso faz algum sentido. Dessa maneira, podemos facilmente reutilizar o algoritmo de encontrar a última aparência de uma palavra-chave em um texto, mas parece "demais". Não posso explicar o porquê, mas apenas "sinto" "dessa maneira):
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
Variação C (na minha opinião, isso é um absurdo. Basicamente, estamos encapsulando uma linha em outro método com apenas uma linha duas vezes. Mas alguém poderia argumentar que a maneira de abrir algo pode mudar no futuro, devido a alguns pedidos de recursos , e como não queremos alterá-lo muitas vezes, mas apenas uma vez, apenas o encapsulamos e separamos ainda mais nossa função principal):
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
Então, minha pergunta agora: qual é a maneira correta de escrever esse código e por que as outras abordagens estão certas ou erradas? Eu sempre aprendi: separação, mas nunca quando é simplesmente demais. E como posso ter certeza no futuro, de que está "correto" e de que não precisa de mais separação quando estou codificando novamente?
line_number = 0
é um padrão numérico, e line_number = line
atribui um valor de string (que é a linha conteúdos não-lo de posição )
open
e in
. Reimplementar as funções existentes não aumenta a separação de preocupações, a preocupação já é tratada na função existente!