プロが教えるわが家の防犯対策術!

お世話になっております。
C言語のカテゴリで同様の質問をしたのですが、Javaだったらどうなるのか気になって書きました。
Switch case文を Switch Caseを使わずに、サブルーチンというかオブジェクトとして定義して、いつでも呼び出せるようにしたいのですが、どういう風に書けば完全とまではいけなくても似たような動きをするものができるのか、自分で考えたのですがやっぱりハードルが高かったと思いここに書きました。引数とかはお任せします。JavaはCよりもわかっていないので頓珍漢なことを書いてしまっていたらすいません。

質問者からの補足コメント

  • うーん・・・

    すいません。補足です。実際はJavaではない言語で、Switch caseが実装されていません。そのためSwitch Caseに近いものが作りたくなりました。実際の言語は社外秘でかけません。よろしくお願いいたします。

      補足日時:2015/10/15 21:24

A 回答 (4件)

あなたの前回の質問の補足ですが


>実は、switch caseがない言語で開発しています。
>すると必然的に、if else の連発になります。
>コードが長くなり、非常にわかりにくく、かつ重いのです。
>そこで、switchcaseを作ろうと思いました。
ということでした。

C言語のswitch case文では
switch 変数名
case 定数1
処理1(複数行の場合もあり)
break
case 定数2
処理2(複数行の場合もあり)
break
case 定数3
処理3(複数行の場合もあり)
break
default
処理4(複数行の場合もあり)

となります。
これをif文で書くと
if 定数1
処理1(複数行の場合もあり)
elseif 定数2
処理2(複数行の場合もあり)
elseif 定数3
処理3(複数行の場合もあり)
else
処理4(複数行の場合もあり)

のようになります。

問題点は以下の2つです。
あなたが開発してる言語を仮にX言語と呼ぶと
問題点1.X言語で上記のif文で書いたコードを関数で実装できるか?
問題点2.仮に実装できたとして、処理速度は向上するか?

問題点2については、処理速度の向上はまず期待できないでしょう。
むしろ、関数の呼び出しのオーバーヘッドのぶん、遅くなる可能性が高いです。
従って、問題点2は、遅くなっている箇所(ボトルネック)を特定し、そこのアルゴリズムを見直す
ことでしか解決の方法はありません。
よって、switch caseの関数化は、処理速度の観点から言えば、やる必要なしという結論になります。

問題点1についてですが、関数で実装する為には、
処理1,処理2などの複数行に渡るコードをパラメータとして、渡す機能がX言語にあるかどうかが問題になります。
C言語であれば、処理1の部分を1つの関数にして、その関数名(関数へのポインター)を渡す機能がありますので、
それで実装可能ですが、あなたのX言語にその機能はあるのでしょうか?
もし、なければ実装不可能です。
もし、その機能がない場合の折衷案として、処理1、処理2、処理3・・・は固定(ハードコーディング)の処理
にするしかありません。そうすると、その部分は、その関数内部で抱え込むことになり、
処理1、処理2、処理3・・・の内容が変われば、そのぶん、又、それに対応した関数をつくることが必要になります。

従って、
1.X言語に処理1,処理2などの複数行に渡るコードをパラメータとして、渡す機能があるかどうか?
2.もし、あれば、実装可能。
3.もし、なければ、処理1,処理2などは、関数内にハードコーディングで抱え込むが、それが実用的かどうか?
ということになります。

余談ですが、
if 定数1
処理1(複数行の場合もあり)
の場合の、定数は整数型(C言語のint型)と考えてよいですか。
(他に、文字列、不動小数点などが候補になることはないですか)
また、
if 範囲1≦変数x≦範囲2
else if 範囲3≦変数x≦範囲3
のようなケースも関数化したいのでしょうか?
もし、そうであれば、定数を扱う関数とは別に、範囲1,範囲2をパラメータで与えるような関数を作る必要があります。

又、X言語がサポートしている型は、どのような型ですか。
又、C言語には、可変引数を処理できる機能(printfのような関数をサポートする機能、printfは引数を必要なだけ記述できる)がありますが、
X言語にはありますか?
    • good
    • 0

余談:


「本当に社内で独自に作った言語」で「switch (相当) がなくて困っている」なら
作っているところに実装を要求する
のが最も正しいアプローチのような気がする.

少なくとも, こんなところで「この言語だったらどうすればいいですか」「あの言語だったらどうすればいいですか」と無意味な質問を繰り返すよりはよほど有意義だと思うな.
    • good
    • 1

先の質問に回答した者ですが、引数の数を可変とする関数の定義が出来るかどうかは、言語に依るし、出来る場合でもどう書くかはその言語によりけりです。


可変個引数が出来る言語であれば、先の質問の回答をベースに書き換えればいいかと思います。
可変個引数が出来ない言語であれば、分岐が2個用の関数、3個用の関数と、何種類もべつの関数を定義する必要がありますね。

>実際の言語は社外秘でかけません。よろしくお願いいたします。
社内独自作成の言語の場合は、社内で聞くしか無いですね。

>実際はJavaではない言語で、Switch caseが実装されていません。そのためSwitch Caseに近いものが作りたくなりました。
それを関数で作るというのは間違ったアプローチです。if then else if then else if の連鎖で書くのが正しいやり方です。さすがにif then elseの無い言語は無いと思うので。
    • good
    • 0

どのような動作を求めているのですか? 具体例で示してください.



あと, 「実際の言語」を隠したままそれとは違う言語でどうなるかを聞いたところで無意味であることには気付いているのかな?
    • good
    • 0

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