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

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

新規登録して質問してみよう
ただいま回答率
85.54%
Python

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

Q&A

解決済

2回答

3272閲覧

boolを返す関数は可読性がない…? なぜ?

kmtrintr

総合スコア1

Python

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

3グッド

6クリップ

投稿2022/08/30 04:15

SESで前任者から引き継いだプログラムの、過去に実施されたクライアント側の担当者によるコードレビューを読んでいたところ、気になった点があったのでご相談させてください。

気になったのは、「is_blank()などの名前で、bool型の戻り値をもつ関数は可読性を下げるためダメ」というものでした。そのレビューで提示された代替策によると、関数名をcheck_blank()として、値がブランクならば戻り値を文字列(例えば’error’)を返すのが好ましいとのことでした。

気になったのでしばらくググってみたのですが、boolを返す関数に「is〜」と名前をつけるのは、分かりやすい良い命名規則の一例として紹介されているサイトがいくつもありました。また、boolを返す関数はダメだとマサカリを担いだ記事を見つけることもできませんでした。むしろcheck〜やjadge〜などの関数名をアンチパターンとする記事もありました。個人的にも戻り値に固定の文字列を渡すルールは、同じルールの関数が複数になっていったときに、タイピングミスによるバグを生みそうな気もします。

引き継いだプログラムについては既にレビューに沿って改修されていますので、郷に入って踏襲するつもりではあります。

クライアントの意向やレビュアーの方を批判する意図はないのですが、直接聞きにいくのもいささか角が立ちます。

私はまだ経験の浅い身ですので、どういう意図でこのコーディング規約になっているのかとても関心があります。今後の勉強の参考までに、以下の点について先輩方のご意見をお聞かせいただきたいです。

・boolを返すメソッドが好ましくないとされる、あるいはis〜の命名が好ましくないとされるのは一般的なことですか。それとも現場やレビュアーの好みによるものでしょうか。(他の現場であってもこのような記述をするのは避けるべきでしょうか)

・boolではなくあえて判定用の文字列を返すことによるメリットはどのようなものがありますか (呼び出し側が if check_blank(hoge) == ‘error’: となるので、これが可読性を高めるとするポイントということでしょうか)

・好みの要素が強いならば、最初に学んだ言語の文化が反映されるのではないかなと思います。言語の規則等で、何か関連することがあれば教えてください。(今回はPythonで、過去にjavaでもis〜()関数を見てきました)

以上よろしくお願いします。

yoishi, nonoshu, LouiS0616👍を押しています

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

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

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

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

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

Zuishin

2022/08/30 05:05

戻り値の問題ではなく、命名が不適切だったのではないかと思います。 要するに、戻り値の true と false のどちらが成功かわからない名前なのではありませんか? 実際にレビューを受けた関数名を提示すれば話がはやいかもしれません。
TakaiY

2022/08/30 05:08

特に有用な情報は出せないのでここに書きます。 あなたの感覚が全面的に正しいと思います。[if is_blank():」に一票です。 1メンバーとしての立場なら郷に入っては~もそれが正しいでしょう。
kmtrintr

2022/08/30 05:36

ありがとうございます。実際に指摘のあった関数がまさにis_blankでした。
Zuishin

2022/08/30 05:46

is_blank は「何が」の情報が入っていませんが、それ以外は特に問題ないと思うので、ローカルルールかその人の個人的ルールだと思います。
guest

回答2

6

質問者さんの感覚は、一般的な感覚からずれてないと思います。
それは前提として、「is_blank()などの名前で、bool型の戻り値をもつ関数は可読性を下げるためダメ」と言っている人の発想をエミュレーションしてみると、

「データがどのようになっているか?」を調べる関数があっても「そのデータが"かくあるべき"状態なのか?」つまり「Trueが返ってきたら正常なのか、Falseが返ってきたら正常なのか?」をプログラマ側がコードの外の情報から判断しなければならない。それは読む側の負荷になるのでよくない。

くらいの意見なのでは? と想像しました。


"空白であってはいけない時に空白かどうかをチェックする関数"に is_blank と名前を付けるのは筋が悪いという主張なら一定理解ができます。

それはそれとして

空白かどうかをチェックするだけの is_blank 関数があってはいけないなんてことは全然なく、「is_blank()などの名前で、bool型の戻り値をもつ関数は可読性を下げる」には賛同できない、というのが一般的な感覚かと、
そう想像しました。

投稿2022/08/31 01:17

編集2022/08/31 01:18
quickquip

総合スコア11001

glyzinieh, commetzb, yoishi, BeatStar, t-takayama, LouiS0616👍を押しています

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

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

4

ベストアンサー

あまり新規性はないのでコメントに書き始めたのですが、長くなったので回答に。

一般的なことですか。

会社独自の歴史の蓄積でしょうね。ヒストリカルリーズンのローカル版。
それがレビューアー個人の考えで、周りはまともだとするといくらなんでもすでに淘汰されているはず。

メリットはどのようなものがありますか

メリットは考えつきません。
また「check_blank()"error"を返す」と言うことがどういうことかが分かりにくいので、少なくともネーミングは駄目ですね。errorと言われると直感的には「引数に文字列を渡すべきなのに文字列以外を渡した」ように見えてしまいます。

・言語の規則等で、

管見の範囲で関数返値で論理値を忌避する文化は思い当たらないです。
文字列の一致比較が == など演算子で行えなえず、関数・メソッド呼び出しが必要な言語も珍しからず。
if check_blank(hoge) == ‘Error’:のような大文字小文字間違いのバグを発見するツールも必要ですね。

投稿2022/08/30 08:15

otn

総合スコア84221

glyzinieh, yoishi, mako_0221, BeatStar👍を押しています

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.54%

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

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

質問する

同じタグがついた質問を見る

Python

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