好きなおでんの具材ドラフト会議しましょう

プログラミング初学者です。

添付画像の条件分岐を簡潔なコードにしたいです。
IF文のみで記述しようとしましたがもっと簡単に考えることができるのでは無いかと思っています。

丸々コードにして頂かなくて結構ですので

関数としてコードをわける、戻り値を使用するなど
考え方だけでもアドバイスいただければ幸いです。

「IF文、条件分岐の整理方法」の質問画像

A 回答 (6件)

貴方、アタマがいいね。



> もっと簡単に考えることができるのでは無いかと思っています。

こう考えられる人は少ない、んだ。
生憎、僕は全然VBは知らないんだけど、個人的には発想は間違ってないと思うよ。
図を描ける辺りもいい。

んで、だな。
恐らく単純な問題で、まずは一つの方策。
貴方が恐らく気づいたポイントは、「似たようなパターンが頻出してる」って辺りだと思う。「似たようなパターンが頻出してる」のに全部を関数として一纏めにすると「条件分岐が煩わしい」と。
言い換えると「全部を一つの関数として書いちゃおう」としなければいいんだよな(笑)。
貴方が提示した図はコンピュータサイエンスでは総合的には「木」と言われるモノになっている。「締め切り入力」を「根」、あるいは「ルート」と呼ぶ。「10日以前」とか「xがnullか」と言うのは「節」、あるいは「ノード」と呼ぶ。そして末端を「葉」と呼ぶ。
ちょうど、現実世界にある「木」が上下逆になってるように見えるよね?
で、だ。
葉から考えてみると、

xがnullか---->エラーメッセージ
     |
     |-> 画面遷移

って「パターン」は木の右も左も変わんないわけだよな。こういう「パターンが全く変わらない」部分をまとめちゃって「関数にしちまえばいい」んだよ。
その上も

yがnullか---->xがnullか
     |
     |-> 画面遷移

と実は全く同じパターンだ。と言うことは上で作った関数が・・・汎用的なら適用可能だ、って事だ。ここも右も左もパターンが同じだ。
こういうカンジで、葉から初めてルートに向かって「必要な関数」を組み上げて、呼び出しつつそれらを繰り込んでいけば、最終的にはルートからの分岐は条件分岐が2つで済む、わけだ。
上手い具合に引数と返り値が連鎖出来るように書けば、「全部を一纏めにした関数」として書くよりスッキリすると思うよ。
繰り返すけど、貴方が「もっと簡単に考えることができるのでは無いか」って感付いた最大の原因は「類似パターンが多い」と言う辺りなんだと思う。結果、「類似パターンが多い」のならその「パターン」は敢えて切り出しちゃって、そこだけを「小さい関数」として書いちゃう、ってのが良い方策だと思う。関数は「部品」なんで、そういうパーツを細かく書いていって、最終的に大きな関数にする、ってのはティピカルな方法論だ。
そして一般に、プログラマって「深いネスト(入れ子)は好まない」んだよ。貴方が最初に書こうとした関数は、条件分岐により「深いネスト」を生成する。その辺に拒否感もあったんだろう。そういう「拒否感」は大事な感覚だ。だから最終的に「分岐はたった2つ」まで落とし込むのは戦略的には悪い手ではなくなる。

ちなみに、貴方が描いた図はコンピュータサイエンス的には二分木と呼ぶ。

二分木:
https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86 …

実の事を言うと、VBより高機能な言語(例えば関数がファーストクラスオブジェクトだったり、遅延評価を持ってる言語)だったら、実際貴方が描いたダイアグラムそのままで、データ型として直接二分木を実装する、ってのも悪くない手だとは思う。そうすれば、ちょっとした単純な「検索関数」を作って、二分木を条件によって辿って行くだけで望んだ結果になる、ってテクニックだよな。
まぁ、その辺はVBだと出来ないか、逆にかなりややこしくなる畏れがあるんで、やっぱ単純に「細かい関数」を書いていって繰り込んでいった方がいいと思うよ。
    • good
    • 2

赤い木と黄色い木が、非常に似通っていますよね。


木を共通にして、違いのある部分だけ
if( 締切日が10日以前 ) 赤の処理 else 黄色の処理
の形で各所にバラ撒いたほうが、
何をやっているのか見通しがよいと思います。
    • good
    • 0

簡単にする事のために非常に重要なのはデータ構造を考えることからです。



またそれとは関係なくif分岐はベン図で表せると思っていて、
あなたの行いたい作業における集合がシンプルかどうかで分岐処理の複雑さは異なるかと思いますし、ベン図に起こせば複雑な処理はもっと簡単にも見えます。(見え方、感じ方の問題です。)


多分やりたいこととしては、10日以内なら先月のデータを表示したいみたいなことじゃないでしょうか?
業務ソフトだとそういう需要はよくありますが。
(他の人がより良い回答をしてくれるかもしれません。)
    • good
    • 0

画像投稿は文字が正確に読めないので止めた方が良いです。



エラーメッセージでない方の分岐は、画像の右も左も(文字が読み取れる範囲では)同じように見えるので、すくなくとも、関数・メソッドにすれば良いかと。

下記※に書いた不明点があるので、想像ですが、その前の「10日以前以降」の分岐も、このように大きく2つに分岐するのではなく、「10日以前以降」と「当月、前月当月」のif文をまとめて1つのif文に出来そうな気もします。
そうできると、「同じ処理か2箇所にある」という状態ではなくなるので、必ずしも関数・メソッドにする必要は無いです。


※:「10日以前・以降」というのが、入力した締め日のことなのか、処理する実際の日付のことなのか不明。「締め日が当月か?」等の分岐が真偽どっちがどっちなのか不明。
    • good
    • 1

条件を整理しなさい。


そのうえで最適解を求めるんだ。
アルゴリズムってそういうもんだぞ。

そして、それができないなら垂れ流しのコードを書けばイイ。
それが最低であっても結果は出る。
場合によってはそういうコードのほうが効率よく演算できるなんてことは、
プログラミングをしていると頻繁に遭遇することになる。
で、「なんでこれで演算速度が速いんだ?」と一瞬悩む。そして次の瞬間に悩んだことを忘れる。
    • good
    • 0

これだけじゃ分からないと思います

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A