No.3ベストアンサー
- 回答日時:
貴方、アタマがいいね。
> もっと簡単に考えることができるのでは無いかと思っています。
こう考えられる人は少ない、んだ。
生憎、僕は全然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だと出来ないか、逆にかなりややこしくなる畏れがあるんで、やっぱ単純に「細かい関数」を書いていって繰り込んでいった方がいいと思うよ。
No.6
- 回答日時:
赤い木と黄色い木が、非常に似通っていますよね。
木を共通にして、違いのある部分だけ
if( 締切日が10日以前 ) 赤の処理 else 黄色の処理
の形で各所にバラ撒いたほうが、
何をやっているのか見通しがよいと思います。
No.5
- 回答日時:
簡単にする事のために非常に重要なのはデータ構造を考えることからです。
またそれとは関係なくif分岐はベン図で表せると思っていて、
あなたの行いたい作業における集合がシンプルかどうかで分岐処理の複雑さは異なるかと思いますし、ベン図に起こせば複雑な処理はもっと簡単にも見えます。(見え方、感じ方の問題です。)
多分やりたいこととしては、10日以内なら先月のデータを表示したいみたいなことじゃないでしょうか?
業務ソフトだとそういう需要はよくありますが。
(他の人がより良い回答をしてくれるかもしれません。)
No.4
- 回答日時:
画像投稿は文字が正確に読めないので止めた方が良いです。
エラーメッセージでない方の分岐は、画像の右も左も(文字が読み取れる範囲では)同じように見えるので、すくなくとも、関数・メソッドにすれば良いかと。
下記※に書いた不明点があるので、想像ですが、その前の「10日以前以降」の分岐も、このように大きく2つに分岐するのではなく、「10日以前以降」と「当月、前月当月」のif文をまとめて1つのif文に出来そうな気もします。
そうできると、「同じ処理か2箇所にある」という状態ではなくなるので、必ずしも関数・メソッドにする必要は無いです。
※:「10日以前・以降」というのが、入力した締め日のことなのか、処理する実際の日付のことなのか不明。「締め日が当月か?」等の分岐が真偽どっちがどっちなのか不明。
No.2
- 回答日時:
条件を整理しなさい。
そのうえで最適解を求めるんだ。
アルゴリズムってそういうもんだぞ。
そして、それができないなら垂れ流しのコードを書けばイイ。
それが最低であっても結果は出る。
場合によってはそういうコードのほうが効率よく演算できるなんてことは、
プログラミングをしていると頻繁に遭遇することになる。
で、「なんでこれで演算速度が速いんだ?」と一瞬悩む。そして次の瞬間に悩んだことを忘れる。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 複数条件の分岐処理の上手な方法 4 2024/04/15 04:05
- その他(プログラミング・Web制作) プログラムの素朴な質問です 分岐するコードを書く時に、 /** * 関数 */ sub(){ ... 7 2024/02/07 08:15
- JavaScript JavascriptでDom XSSの脆弱性対策を行いたい 2 2023/09/24 21:20
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- JavaScript disabled プロパティが表示されない原因が分からない 2 2024/02/10 21:44
- C言語・C++・C# c言語 1 2022/11/09 13:05
- Excel(エクセル) エクセル関数に詳しい方、教えてください(テキスト関数と条件付書式) 1 2024/04/11 02:44
- PHP PHPSpreadsheetを使って関数を繰り返し埋め込みたい 1 2023/05/24 11:33
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- Excel(エクセル) マクロ、条件付き書式のfont.color 1 2023/03/28 01:10
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
時間短縮のために、テキストファイルの入出力をメモリを使って出来ないですか?
Visual Basic(VBA)
-
プログラムの実行時に'<'でリダイレクトする場合でも、キーボードからの入力を受け取られる件について
C言語・C++・C#
-
VBAなくなるの?
Visual Basic(VBA)
-
-
4
10進数からN進数に変換するプログラミング(C言語)
C言語・C++・C#
-
5
VBA レジストリの値の読み方について教えてください
Visual Basic(VBA)
-
6
プログラミングの課題がわからないので教えていただきたいです。特にサークル関数を定義した後に呼び出す方
C言語・C++・C#
-
7
プログラミング
Visual Basic(VBA)
-
8
このプログラミング言語のfor分の文法構造を教えてください
その他(プログラミング・Web制作)
-
9
次の日本語の意味を教えて下さい
C言語・C++・C#
-
10
c言語のリダイレクトによる円の描画について
C言語・C++・C#
-
11
プログラム言語について c言語もコードによって機械語に通訳されると知りました。直接機械が通訳しなくて
C言語・C++・C#
-
12
逆コンパイルと逆アセンブルの違いはなんですか
C言語・C++・C#
-
13
これて逆じゃないですか?
C言語・C++・C#
-
14
Excel-VBAのmsgBox()の不思議
Visual Basic(VBA)
-
15
[C言語]fputsとfprintfの違い
C言語・C++・C#
-
16
西暦や和暦の表示をyyyymmdd表示へ変更をしたい
Excel(エクセル)
-
17
プログラマーと学歴の関係性について
その他(プログラミング・Web制作)
-
18
CPUが16bitでも32bitOSでコンパイルしたコード(例えばintが4バイトと定義されている)
C言語・C++・C#
-
19
c言語
C言語・C++・C#
-
20
パソコン
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
IF文、条件分岐の整理方法
-
Exel VBA 別ブックから該当デ...
-
1日に1人がこなせるプログラム...
-
access2003 クエリSQL文に...
-
JANコードとPOSコードは同じ?
-
sinカーブの表示のさせ方
-
COBOLの文法
-
文字列を検索しその列をコピー...
-
SQL
-
【VB6】実行ファイルとした後、...
-
JIPS-Eコードのコード表について
-
JavaScriptの定数名が取り消し...
-
ACCESSで、履歴事項を管理する...
-
コンボボックスの複数列表示に...
-
◾️Excel VBA 統合について Cons...
-
EXCEL VBA 最初だけ0という値を...
-
ExcelVBAで「Shift_JIS(MS932)...
-
CheckBoxのコントロール配列に...
-
C# コードビハインドについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1、Rstudioで回帰直線を求める...
-
1日に1人がこなせるプログラム...
-
access2003 クエリSQL文に...
-
エクセルVBAコードで教えて下さ...
-
Exel VBA 別ブックから該当デ...
-
JavaScriptの定数名が取り消し...
-
COBOLの文法
-
access2021 VBA メソッドまたは...
-
PreviewKeyDownイベントが2回...
-
JANコードとPOSコードは同じ?
-
過剰なオブジェクト指向脳から...
-
特定行の背景色を変えたいのですが
-
ACCESSユニオンクエリでORDER B...
-
変数名「cur」について
-
Nullの使い方が不正です。
-
◾️Excel VBA 統合について Cons...
-
欠番の抽出について
-
VBA リストボックス(複数条件...
-
ACCESSで、履歴事項を管理する...
おすすめ情報