質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

4558閲覧

フラグ変数の使用を避ける方法が知りたいです

movswr

総合スコア13

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/28 10:48

プログラミング初心者です。
フラグ変数は可読性を下げるため良くないと聞きましたが、どのように使用を避ければいいのかわかりません。
フラグ変数を使わない場合、以下のコードはどのように書けるのでしょうか?

Python

1def argCheck(): 2 args = sys.argv 3 flag = False 4 5 if len(args) != 2: 6 flag = True 7 if args[1].split('.')[1] != 'txt': 8 flag = True 9 10 if flag: 11 print('Invalid arguments') 12 sys.exit(1)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

目的は、読みやすさ(可読性)なので、フラグを使って可読性が下がると思えば止めれば良いし、可読性が上がると思えば使えば良いです。

その前にバグの無いコードを書くことが大事ですが。

len(args)が1の時でもargs[1]を参照している
args[1].が含まれない場合を考慮していない

エラーかどうかの条件判断を一つのif文で行えばフラグは要らないです。

Python

1def argCheck(): 2 if len(sys.argv) == 2 and "." in sys.argv[1] and sys.argv[1].split(".")[1] == "txt": 3 pass # check OK 4 else: 5 print('Invalid arguments') 6 sys.exit(1)

少し改善すると、

Python

1def argCheck(): 2 if len(sys.argv) == 2 and sys.argv[1][-4:] == ".txt": 3 pass # check OK 4 else: 5 print('Invalid arguments') 6 sys.exit(1)

投稿2021/03/28 11:21

otn

総合スコア85762

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2021/03/28 11:52

if の条件を反転させると、 else が不要になる? もっとも可読性に関して不明。 (細かな話)
otn

2021/03/28 11:56

今回は、正常ケースを記述する方が読みやすいですね。 if not ( ~~ ): でもいいのですが。
movswr

2021/03/28 11:59

回答ありがとうございます。バグ見落としていました。可読性は一概に下がるわけではないんですね。参考になります。
guest

0

一般的には、他に方法がない場合はフラグを使いたい部分を別関数にすることで避けることができます。

python

1def argCheckSub(args): 2 if len(args) != 2: 3 return 'error', 'this command accept one option only' 4 elif args[1].split('.')[1] != 'txt': 5 return 'error', 'please specify ".txt" file' 6 else: 7 return 'OK', 'OK' 8 9def argCheck(): 10 result, message = argCheckSub(sys.argv) 11 if result == 'error': 12 print(message) 13 sys.exit(1) 14 else: 15 pass

このようにしておくことで、argCheckSubだけのテストも簡単にできるようになります。

python

1>>> argCheckSub(['', 'a.txt']) 2('OK', 'OK') 3>>> argCheckSub(['', 'atxt']) 4Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6 File "<stdin>", line 4, in argCheckSub 7IndexError: list index out of range

このエラーが出るのは、atxt のように"."のない名前の場合です。エラーが簡単に検出できることは、保守性向上にもつながりますので、別関数化は役に立ちます。

投稿2021/03/28 11:38

ppaul

総合スコア24668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

movswr

2021/03/28 12:07

回答ありがとうございます。エラーを細かく分けれるので良さそうですね。とても参考になりました。
guest

0

python

1 if (len(args) != 2) or (args[1].split('.')[1] != 'txt'): 2 どーたらこーたら

まあ、一概にフラグは悪、というわけではないです。
フラグを使うことでわかりやすくなるとか、見通しが良くなるのであれば、どしどし使うべきです

投稿2021/03/28 11:03

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

movswr

2021/03/28 12:08

回答ありがとうございます。一概に下がるわけではないんですね。参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問