私はすっきりしたコードが大好きで、コードを可能な限り最善の方法でコーディングしたいと思っています。しかし、常に1つありましたが、本当に理解できませんでした。
メソッドに関する「懸念の分離」が多すぎるのはいつですか?
次のメソッドがあるとします。
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
この方法はそのままでも問題ないと思います。それはシンプルで読みやすく、そしてその名前が言うように、それは明らかにそうです。しかし、それは「ただ1つのこと」を実際に行っているのではありません。実際にファイルを開き、それを見つけます。それは私がそれをさらに分割できることを意味します(「単一の責任の原則」も考慮する):
バリエーションB(まあ、これは何となく理にかなっています。このようにして、テキスト内のキーワードの最後の出現を見つけるアルゴリズムを簡単に再利用できますが、「多すぎる」ように見えます。理由は説明できませんが、「感じる」 「それはそのように):
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
バリエーションC(これは私の考えではばかげています。基本的には、1行を2行1行で別のメソッドにカプセル化しています。ただし、機能のリクエストにより、何かを開く方法が将来変更される可能性があると主張することもできます。 、そして何度も変更したくないので、一度だけ、それをカプセル化してメイン関数をさらに分離します):
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
だから私の質問:このコードを書く正しい方法は何ですか?なぜ他のアプローチは正しいですか間違っているのですか?私は常に学びました:分離、しかしそれが単に多すぎるときは決して。そして、将来的に、それが「適切」であり、再度コーディングするときにそれ以上分離する必要がないことをどのように確認できますか?
line_number = 0
数値デフォルトであり、line_number = line
(ラインである文字列値を代入する内容ではない、それの位置)
open
とin
。既存の関数を再実装しても問題の分離は増えません。問題はすでに既存の関数で処理されています!