Realmente amo el código limpio y siempre quiero codificar mi código de la mejor manera posible. Pero siempre había una cosa que realmente no entendía:
¿Cuándo es demasiado de "separación de preocupaciones" con respecto a los métodos?
Digamos que tenemos el siguiente 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
Creo que este método está bien como está. Es simple, fácil de leer y claramente lo que dice su nombre. Pero: en realidad no está haciendo "solo una cosa". En realidad, abre el archivo y luego lo encuentra. Eso significa que podría dividirlo aún más (también teniendo en cuenta el "Principio de responsabilidad única"):
Variación B (Bueno, esto tiene sentido de alguna manera. De esta manera podemos reutilizar fácilmente el algoritmo de encontrar la última aparición de una palabra clave en un texto, sin embargo, parece "demasiado". No puedo explicar por qué, pero simplemente "siento" "de esa manera):
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
Variación C (Esto es simplemente absurdo en mi opinión. Básicamente estamos encapsulando una línea en otro método con solo una línea dos veces. Pero se podría argumentar que la forma de abrir algo puede cambiar en el futuro, debido a algunas solicitudes de características , y como no queremos cambiarlo muchas veces, pero solo una vez, simplemente lo encapsulamos y separamos nuestra función principal aún más):
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
Entonces mi pregunta ahora: ¿Cuál es la forma correcta de escribir este código y por qué los otros enfoques son correctos o incorrectos? Siempre aprendí: Separación, pero nunca cuando es simplemente demasiado. ¿Y cómo puedo estar seguro en el futuro, que es "justo" y que no necesita más separación cuando estoy codificando nuevamente?
line_number = 0
es un valor numérico predeterminado y line_number = line
asigna un valor de cadena (que es el contenido de la línea, no su posición )
open
y in
. Volver a implementar las funciones existentes no aumenta la separación de las preocupaciones, ¡la preocupación ya se maneja en la función existente!