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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

12回答

15445閲覧

Ifの中に関数を入れることについて

redPhosphorus

総合スコア31

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2015/11/25 07:55

VB

1If fooFunction = False Then 2 bar = 0 3End If

Java

1If (fooFunction() == False) { 2 bar = 0; 3}

上記のようなコードで、「fooFunction = False」のように関数をIfの中に入れることがダメだという先輩がいて、納得できません。
ダメな理由や推奨されない理由があれば教えて下さい。

またVBに限らず、JavaやJavaScript、C#などどのような言語でもいいので、そのような習慣?のある言語があれば教えて下さい。
よろしくお願いします。

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

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

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

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

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

ozwk

2015/11/25 07:58

(どういった状況で)なぜダメと言われたのかをお願いします。
redPhosphorus

2015/11/25 08:02

ソースコードレビューにて「こう書くのは昔ダメだって教わったからダメなんじゃないかな?よく分からないけど。」というようなシチュエーションです。 なぜダメなのか、については本人も分からないとのことでした。 用法としては、入力チェック関数から返ってきた値がFalseなら抜ける、という感じです。 If check = False Then Exit Sub End If
guest

回答12

0

多分ですが、デバッグがしにくいからかもしれませんね。
単純なTrue False の判定であれば問題ありませんが
戻り値が、数値や文字列の場合に実際に関数から戻ってきている値が
何なのか解り難いと思います。
一度変数に入れておけば、デバッグ時等で解りやすくなると思います。
それぐらいしか、思いつきません。
後は会社の方針ですかね・・・

投稿2015/11/25 08:09

trick

総合スコア366

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

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

redPhosphorus

2015/11/25 08:13

なるほど。確かにデバッグのしやすさは重要ですね。 会社全体の方針と言うことではなさそうです。 回答ありがとうございます。
guest

0

質問のコードでもし直す必要があるとすればむしろBoolean同士を比較しているところではないでしょうか。

If Not fooFunction Then bar = 0 End If

投稿2015/11/25 08:34

sho_cs

総合スコア3541

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

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

redPhosphorus

2015/11/25 09:48

なるほど! 確かにNotでとったほうがいいですね! 回答ありがとうございます。
guest

0

C/C++/C#と使ってきましたが、そのようなことは一度も言われたことはありませんし、私自身は何の躊躇もなくif文等で関数を呼び出しています。
ただし、デバッグでステップ実行させたりするときに関数の戻り値を知りたいという理由で、あえて変数に入れてからif文等で使うということはよくあります。

コードを見たところ、VBでは関数呼び出しなのか変数なのか判りづらいですね。もしかしたら先輩はVB特有のコードの見づらさを気にしているのかもしれません。引数がなくても括弧を付ければいいような気もしますが。私なら括弧を付けます。

投稿2015/11/25 08:15

catsforepaw

総合スコア5938

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

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

redPhosphorus

2015/11/25 08:17

見づらさ、分かりづらさの問題なのでしょうか。 確かにそのような気がしますね。 回答ありがとうございます。
guest

0

余談ですが、VSであれば、質問者さんのような記述をしても戻り値をチェックすることが出来ます。
イメージ説明

投稿2015/11/25 10:02

編集2015/11/25 10:03
nexstar

総合スコア53

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

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

redPhosphorus

2015/11/25 10:09

そうだったんですね! VSすごい! 回答ありがとうございます。
guest

0

あんまりダメな理由は思い浮かびませんが、例えば

  • そのプロジェクトのコーディング規約ではそうなっている(そうなっていた)
  • ループの中で毎回関数が動くとコストがかかるので避けたい
  • 一時的にでも変数に格納しないとデバッグの時に内容がわからないので嫌だ

あたりは可能性としてありえるでしょうか。

仰る通り「習慣」や「コーディング規約」に属するものなので、それを採用している人しか理由はわからず、採用している人が理由がわからない場合(理由はわからないが代々受け継がれている。既存のプロダクトとの統一のためだけに採用している)は「なぜ」というのは永久にわからない可能性すらありますね。

投稿2015/11/25 08:20

tanat

総合スコア18713

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

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

redPhosphorus

2015/11/25 08:24

新規に立ち上がったプロジェクトで構成も私と先輩の二人っきりという感じです。 ループ内でもないし、特に問題はなさそうですね。先輩には特に問題はなさそうだと伝えます。
guest

0

関数の戻り値をデバッガで確認したいことって結構あります。
その時、確認しづらいからやめた方がよいよって意味かも知れません。
特にC/C++ではboolでなくてもif文の中にかけるので、時々はまります。

でも、if文の中で関数呼び出ししたからといって可読性が劣化することはあまりないので、人に強制するようなルールではないと感じます。

投稿2015/11/25 08:18

Chironian

総合スコア23272

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

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

redPhosphorus

2015/11/25 08:20

確認しづらさという意見が多いようですね。 回答ありがとうございます。
guest

0

VBのように関数呼出で引数がない場合にカッコを省略できる言語の場合は、カッコがないと変数なのか関数なのかわかりにくいでしょうね。ほかには思いつかないですし、私はifの中で関数を使ってもまったく違和感は感じません。

投稿2015/11/25 08:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

redPhosphorus

2015/11/25 08:08

見た目の問題ですね。確かにそれはある気がしますね。 回答ありがとうございます。
guest

0

PHPの場合ですが、入力値とかの変数に値が設定されているかを判定するためにisset関数を使用しますが、普通に以下のような書き方をします
その先輩が、なぜそのような書き方をするのか、理由を聞いてみてはいかがでしょうか?

PHP

1if (!isset(static::$_config[$name])) { 2 return false; 3}

投稿2015/11/25 08:04

編集2015/11/25 08:07
KatsumiTanaka

総合スコア924

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

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

redPhosphorus

2015/11/25 08:05

PHPでは特に問題なく使えるということですね。 回答ありがとうございます。
guest

0

完了済みとはなっていますが、ベストアンサーにケチをつけたので他の方から上がっていない可能性を上げておきます

fooFunctionの関数内で判断する処理だけでなく値が変化するような処理が入っている場合は、その都度呼び出していると結果が変わる可能性があります
その場合は一度変数で受けてから変数の方を使います
例えばログ出力が必要な場合に実際に必要なタイミングで呼び、さらにログ出力でもう一度呼ぶと結果が変わってる、もしくは結果に変化はないものの、他で使用する値が変わってしまうといった場合に、
例えばテスト環境(開発環境が入っていないところ)での動作確認でログ出力させると動きがおかしくなるといった可能性もありますので、fooFunctionの関数の内部処理によってはIFの条件で直接使用してはいけないかもしれません
そう言った問題が全くなく、関数の処理コストも軽いのであるならば問題ないと思います

投稿2015/12/01 11:58

len_souko

総合スコア1348

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

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

redPhosphorus

2015/12/01 12:05

そういった問題はありません。 そもそもコストの大きい「関数」もよくないですよね。
guest

0

私はあまり意識せずにif文中に関数入れていますが、
以下のような問題が発生する場合もあります。

If funcA() = True Or funcB() = True Then
.....
End If

funcA() がTrue を返した時、funcB() は
評価されるのかどうか、はっきりしません。
(funcB() を評価しなくてもこのIf は Trueなので)
funcA 、funcB がどちらが先に評価されるか、という話もあります。
言語やコンパイラに依存するかもしれませんし。

投稿2015/11/25 08:37

yoshi777

総合スコア674

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

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

redPhosphorus

2015/11/25 09:51

上記のような問題は.NETならOrElseとかだといいですね。 いろいろと考えなきゃいけませんね。 回答ありがとうございます。
guest

0

自己解決

見た目の問題、デバッグのしづらさの問題、あとは謎の習慣の3説くらいですかね。
先輩にはそのように伝えてみます。
皆さん、回答ありがとうございました。

投稿2015/11/25 08:27

redPhosphorus

総合スコア31

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

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

k1000

2015/12/01 10:50

システムによると「評価を下げる場合は理由記入してください」とのことなので、記入します。 ご自身の回答をベストアンサーに選択されていますが、この内容では自身で解決したわけではなく単なるお礼であって、質問に対する「ベストアンサー」とは言えないと思います。ご自身でも納得の行くような回答が他にあるようですし(事実として同意するコメントを残していらっしゃいますね)、多くの中からどれか一つに決めかねるにしても、例えば最も評価の高い回答なり会社の人に聞いた結果に近いものなりなるべく客観的な何らかの理由をつけて「ベストアンサー」の評価を下すのが、このようなサービスを利用する上での責任ではないかと思います。
think49

2015/12/01 11:09

k1000さんに同意します。 redPhosphorusさんの返答を見たところでは「回答が参考にならなかった」というわけでもないようですのでベストアンサーを選ぶのが筋ではないかと思います。
redPhosphorus

2015/12/01 11:24

そういう考えもありますね。失礼しました。 どの回答にも公平になるようどれか一つを贔屓にし、持ち上げることをしたくありませんでした(どれもベストアンサーとしたいです)。 また、この質問は他の質問のように正解があるものではありません。先輩も「ふーんそんなのもあるかもね」程度です。私の「自己解決」とします。
len_souko

2015/12/01 11:48

他の人の回答を自分の手柄にして足蹴にする非道な行為なので この質問をしてみんなに助けてもらうという助け合いのシステムを全否定する行為なので悪しき慣習とならないように僕もマイナス評価を付けておきます
guest

0

関数の戻り値を判断する記法で、いけない理由はないと思います。
あるとするなら、戻り値の型と右辺の型が合っていないということでしょうか。
その先輩に具体的な理由を聞いてみてはいかがでしょう。

投稿2015/11/25 08:07

osmoc-1970

総合スコア124

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

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

redPhosphorus

2015/11/25 08:10

支持ありがとうございます。 戻り値と右辺の型はどちらもBooleanで、正しく動作もします。 それだけに謎発言です(先輩もよく分かってないので皆さんの回答を伝えてみますね)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問