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

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

ただいまの
回答率

90.61%

  • PHP

    19860questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • コーディング規約

    47questions

    コーディング規約とは、コードの書き方についての決め事のことです。 文法のことではなく、そのチームなどの中の約束事としてどのような書き方で行うかを定めるもの。 項目の例として、関数や変数の命名規則、コーディングのスタイル、括弧やインデントの書き方などが挙げられます。

  • 命名規則

    35questions

    命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。

判定条件のreturnをどのようにするかについて

受付中

回答 9

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 304

kintonet

score 55

下記のような記述で変数に代入している箇所を全てreturnにしたほうが、全体の見通しが良いのでは無いかと指摘されたのですが、
どちらでも変わらないと思うのですが逐次代入するのは邪道でしょうか。
判定ごとにreturnで返却するとどの条件にもマッチしない場合を return ''; のように記載するのが好みでは無いので何か良いご意見は無いでしょうか。
抜けていましたが前提として elseifは利用できない決まりになっています。

   public function get_item_name($item_data) {
       $item_name = '';
       if (isset($item_data['name'])) {
           $item_name = $item_data['name'];
       }
       if (self::is_special($item_data)) {
           $item_name = '特殊名称';
       }
       if (isset($item_data['no']) && $item_data['no'] == '0' ){
           $item_name = '例外名称';
       }
       return $item_name;
   }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/20 15:32

    後出しで前提条件が出ているため、回答が多く付いても話が進みません。規約等あるのでしたら質問に記載しておいてください。既に「好みではない」というような質問者さんのコメントがあるため「好みで良い」「自由に回答して良い」という流れになり、本来得たいはずの回答が得られにくい状況になっています。

    キャンセル

回答 9

+3

リーダブルコード的には早めにreturnすべき。
個人の好みなんて曖昧なものは捨てる。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/20 14:30

    ガード節をつくったほうが安牌な気はしています。

    キャンセル

+2

具体的に何をやっているかわからず回答してますけども。

条件が同時に成立せず$item_nameが確定するのであれば、
elseifで数珠つなぎにした方が余計な処理を踏まずに済みます。

   public function get_item_name($item_data) {
       $item_name = '';
       if (isset($item_data['name'])) {
           $item_name = $item_data['name'];
       }
       elseif (self::is_special($item_data)) {
           $item_name = '特殊名称';
       }
       elseif (isset($item_data['no']) && $item_data['no'] == '0' ){
           $item_name = '例外名称';
       }
       return $item_name;
   }

すでに代入した $item_name についてさらに吟味する必要があるなら、
elseifは使えませんが。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/20 15:03

    そのelseifを使えない規約なのと今の所$item_nameを吟味する必要は無いので逆らわずにreturnしておいたほうが安牌かなと思っています。

    キャンセル

  • 2018/06/20 16:00

    じゃぁ都度returnで。

    キャンセル

  • 2018/06/20 17:34

    なぜelseifを禁止しているのかわかりませんが、そのような無意味な規約はやめたほうが良いです。
    この関数では、関係ないですが、returnする前に何らかのリソースの開放が必要なコードであれば、returnごとにリソースの開放を書かなければなりません。
    なお、このルーチンでは、$item_data['name']が入っていて、self::is_special($item_data)が成立したら、'特殊名称'が返ってきます。おそらく期待した値ではないと思います。

    キャンセル

  • 2018/06/20 17:47

    ありがとうございます。elseif自体が可視性が良く無い事は承知しているものの、オープンソースなどを見ても一定数記載があるので規約としてどうだろうかとは思っています。(考えた人は恐らく何かの記述を勘違いして踏襲したんだと思います)

    キャンセル

+2

好みの問題ですね。
コーディング規約で決まっていないのであれば、現状のままでよいと思います。
規約によってはreturnは関数内で1つというところもありますし、私もこの処理であれば現状のままの方がわかりやすいと思います。

指摘通り各条件でreturnする場合、elseifでつながっていないので、動きが変わってしまいます。
指摘した人はそのことも考慮して指摘しているのでしょうか。
それともelseifになっていないのは、設計・コーディングミスでしょうか。

補足
即return回答が多いので補足しておきます。
私がこのままでよいと回答したのはあくまでもget_item_name関数という閉じた処理だからです。
あれもやってこれもやってみたいな関数では、以降の処理が不要な場合は即returnするほうが私は好きです。
ネストが浅く作れますから、必然的に可読性があがります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/20 14:30

    elseif自体を許容しない規約のため即時returnしろってことなのかなとは思ってます。

    キャンセル

+2

邪道じゃないけど無駄な処理をしがちになるかインデントが深くなりがちになる
値が確定したら即返すようにしておくと
無駄な処理をしてしまう心配がなくなるしインデントが深くなりにくい

今のコードでも全てifの条件にかかってしまう$item_dataが渡ってきたら
$item_nameは最終的に必要な代入が1回なのに3回も代入をされる

特にself::is_special()が重い処理であるなら
それが$item_data['no'] == '0'なら無駄になるというのはコスト

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

$item_data['no'] == '0'
とか残ってる時点で、どうでも良いレビューな気がする。。。

好み問題で言うと、即 return が好き。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

記載されているコードを前提の話になってしまいますが、

■ 逐次変数に代入し、最後にreturnの場合
⇒関数の最後まで何をしているか読む必要がある。
(該当の分岐処理が完了した後に値が変更されている可能性がある為)

■ 各分岐内でreturnしている場合
⇒returnで処理は終了するため、その後の処理を読む必要がない。

単純に第三者がリーディングした際に掛かるコストを考えるのであれば後者の方が良いかもしれませんね。
まあm6uさんが回答されているとうにelseifでいいかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

なにか理解がオカシイような・・・
即時returnするならifの順番を逆転させないといけないですよね?
つまり上から順番に条件によって$item_nameを上書きしているのですから
優先順位が高いのは一番下です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

要件によります。前後の処理にもよります。
つまり、このコードだけでは何とも言えないのが正直なところです。

このコードだけで判断するなら既に回答にありますがelseifでつないで(elseなしにしました)即returnです。

   public function get_item_name($item_data) {
       if (isset($item_data['name'])) {
           return $item_data['name'];
       }
       if (self::is_special($item_data)) {
           return '特殊名称';
       }
       if (isset($item_data['no']) && $item_data['no'] == '0' ){
           return '例外名称';
       }
       return '';
   }

もし取得先で何かしら判断があるならreturn '';を抜いて
取得先でnull判定するのもありかもしれません。
要は、このメソッドでどこまで肩を持つか 次第ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「elseifを禁止する」=「elseifで書くような複数分岐は、途中リターン(や途中ブレイク)などで実現する」という趣旨だと思うので、一択ですね。
1つのメソッドのサイズ(複雑さ)にも制限があるのではないかと思います。

「全体の見通しがよい」とか言うレベルの話ではない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    19860questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • コーディング規約

    47questions

    コーディング規約とは、コードの書き方についての決め事のことです。 文法のことではなく、そのチームなどの中の約束事としてどのような書き方で行うかを定めるもの。 項目の例として、関数や変数の命名規則、コーディングのスタイル、括弧やインデントの書き方などが挙げられます。

  • 命名規則

    35questions

    命名規則は、プログラミングする際に識別子の名称である文字列を決める表記法のことです。ネーミング規則・ネーミング規約・命名規約とも呼びます。