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

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

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

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

Q&A

解決済

3回答

199閲覧

プログラムの別の書き方

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2017/06/21 08:48

編集2017/06/21 13:49

以下のコードは、

flgにチェックが入ったら、PHASE10に
yoteibiに値が入ったら、statusをPHASE50に
kakuteibiに値が入ったら、statusをPHASE60に
jisshibiに値が入ったら、statusをPHASE70に

更新しようとしているプログラムです。

それ以外に、flgにチェックが入っても、
もしstatusがPHASE20,30,40の場合は、PHASE10にしない制限があります。

さらに、yoteibiにおいても、yoteibiの値を消して、
statusがPHASE50だった場合で、
かつ、flgにチェックがあれば、PHASE10にステータスを遷移させています。

kakuteibiやjisshibiもyoteibiと同じような感じになっています。

このソース一見わかりにくいので、シンプルに書き換える方法あれば
どんな感じにできるでしょうか。

function setStatus(newIntro) { if (data.flg && (new Set<String>{'PHASE20', 'PHASE30', 'PHASE40'}).contains(data.status)) { // do nothing } else { data.status = 'PHASE10'; } if (data.yoteibi != null && data.status != 'PHASE60' && data.status != 'PHASE70' ) { data.status = 'PHASE50'; } else if (data.yoteibi == null && data.status != 'PHASE50' && data.flg) { data.status = 'PHASE10'; } if (data.kakuteibi != null && data.status != 'PHASE70') { data.status = 'PHASE60'; } else if (data.kakuteibi == null && data.status != 'PHASE60') { if (data.yoteibi != null) { data.status = 'PHASE50'; } else if (data.flg) { data.status = 'PHASE10'; } } if (data.jisshibi != null) { data.status = 'PHASE70'; } else if (data.jisshibi == null && data.status != 'PHASE70') { if (data.kakuteibi != null) { data.status = 'PHASE60'; } else if (data.yoteibi != null) { data.status = 'PHASE50'; } else if (data.flg) { data.status = 'PHASE10'; } } }

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

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

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

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

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

KSwordOfHaste

2017/06/21 08:57

JavaではなくJavascriptなので質問のタグを変更しておいてください。
m.ts10806

2017/06/21 09:45

PHPは関係なさそうですね。質問のタグをはずしておいてください。
kei344

2017/06/21 17:22

new Set<String>{}という記法はブラウザで動くJavaScriptでは無いと思うのですが、どういった環境でどの言語を使われているのでしょうか。
guest

回答3

0

意見は分かれるかと思いますが、個人的な意見を書きます。

このソースで既に動いているのであれば処理は変えない方が良いと思います。
ただし説明頂いた内容をコメントとして書いておくと良いです。

投稿2017/06/21 09:06

mattn

総合スコア5030

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

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

0

ちょっと要件を詰め切れてないので参考までにですが...。
とりあえずフィルタで上書いていくというイメージでしょうでしょうか?
「タイプコード自身がやるべきことを知っててif文が少ない」
というのがOOPらしさともいえます。どちみちリテラルが頻出するのはよろしくないのでenum使ってみる。
※ちなみに基本的なことですがJavaの文字列比較は==使わない。

Java

1//仕込み 2public enum Phase { 3 NONE(0,"NONE",false), 4 FLG(10,"PHASE10",false), 5 HOGE_1(20,"PHASE20",true), 6 HOGE_2(30,"PHASE30",true), 7 HOGE_3(40,"PHASE40",true), 8 YOTEIBI(50,"PHASE50",false), 9 KAKUTEIBI(60,"PHASE60",false), 10 JISSHIBI(70,"PHASE70",false); 11 private Phase(final int code,final String name,final boolean fix){ 12 this.code = code; 13 this.name = name; 14 this.fix = fix; 15 } 16 private final int code; 17 private final String name; 18 private final boolean fix;//この値が入ってる場合変更が無い 19 20 //文字列をenumに変換 21 static Phase getPhase(final String nm){ 22 for(Phase p: values()){ 23 if(p.name.equals(nm)) 24 return p; 25 } 26 return NONE; 27 } 28 Phase checkFilter(final String key,final Phase checkPhase){ 29 //チェック対象がNULLの場合そのまま 30 //PHASE20,30,40の場合なにもしない 31 if(key == null || this.fix) 32 return this; 33 //チェック対象に値がある場合、紐づくコード値が大きい方で置き換え 34 return checkPhase.code > this.code ? checkPhase : this; 35 36 } 37 //自身の結果取得 38 String getName(){ 39 return this.name; 40 } 41}

Java

1//使い方///////////////////////////////////// 2public static void main(String[] args) { 3 Data data = new Data(); 4 data.status = "PHASE50"; 5 //data.jisshibi = "xx"; 6 data.flg = "xx"; 7 data.jisshibi = "xx"; 8 9 Phase nowPhase = Phase.getPhase(data.status); 10 //ここの順番はどうでもいい 11 nowPhase = nowPhase.checkFilter(data.flg, Phase.FLG); 12 nowPhase = nowPhase.checkFilter(data.yoteibi, Phase.YOTEIBI); 13 nowPhase = nowPhase.checkFilter(data.kakuteibi, Phase.KAKUTEIBI); 14 nowPhase = nowPhase.checkFilter(data.jisshibi, Phase.JISSHIBI); 15 data.status = nowPhase.getName(); 16 System.out.println("status="+data.status);//PHASE70 17 18} 19static class Data{ 20 String flg; 21 String yoteibi; 22 String kakuteibi; 23 String jisshibi; 24 String status; 25}

投稿2017/06/21 11:03

kurokoba

総合スコア276

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

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

退会済みユーザー

退会済みユーザー

2017/06/21 14:24

ご回答ありがとうございます。 Enumですか。Enumはホント単純なものしかあつかったことがなく、勉強になります。 NONE(0,"NONE",false), や static Phase getPhase(final String nm){ などのようなことができたりできるんですね。。
KSwordOfHaste

2017/06/21 16:49

蛇足ながら、kurokobaさんの回答はJavascriptではなく、Javaです。 考え方は参考にするとしても言語が違いますので、Javascriptで同じようには書けません。 to:keetonさん
kurokoba

2017/06/22 01:35

すみません、回答時点でJavaタグが付いていたので(そこから修正してません)...。 JavaScriptのOOP(オブジェクト指向プログラミング)には賛否両論あってOOPが良いからこれに倣え、とはいえませんがOOPのプログラミングの思想自体は言語に依存しないものです。 「if文(Switch)をポルモーフィズムへ書き換える」という考え方はOOPに基本的なものですし、M.ファウラー「リファクタリング」でも取り上げられています。 またステータスの定数自体にメソッドを持たせて if(XXX) { doXXX}… みたいなものを分岐なしで書き換えるというのはGoFのデザインパターンでStateパターンの一種ともいえます。 ※まあJavaのenumやScalaのcaseクラスがStateパターン書きやすいというのはありますが...。
guest

0

ベストアンサー

質問内容とソースから察するに、大きいPHASEの条件ほど優先されると見受けられるので、
以下の処理で問題ないのではないでしょうか。

java?javascript?

1function setStatus(newIntro) { 2 String resultStatus = data.status;//一応変数に格納 3 if (data.flg && (new Set<String>{'PHASE20', 'PHASE30', 'PHASE40'}).contains(data.status) ==false) { 4 resultStatus = 'PHASE10';//20~40以外でflgオンなら10 5 } 6 7 if (data.yoteibi != null) { 8 resultStatus = 'PHASE50';//50未満上書き 9 } 10 11 if (data.kakuteibi != null) { 12 resultStatus = 'PHASE60';//60未満上書き 13 } 14 15 if (data.jisshibi != null) { 16 resultStatus = 'PHASE70';//70未満上書き 17 } 18 data.status = resultStatus;//結果を設定 19}

投稿2017/06/21 09:01

編集2017/06/21 09:09
monagano

総合スコア246

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

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

退会済みユーザー

退会済みユーザー

2017/06/21 14:01

ご回答ありがとうございます。 最初私も、上記と似たコードを書いていたのですが、 縦おば、jisshibiが空になったときに、PHASE70のままではなく、PHASE60などに戻すことができると理想で、 そうしたところ、ifが複雑な感じになってしまいました。
monagano

2017/06/22 00:49

jisshibiが空でPHASE60になるタイミングでは、kakuteibiは空なのでしょうか? kakuteibiが空でなければ、上記処理を通過するとおのずとPHASE60になると思います。
退会済みユーザー

退会済みユーザー

2017/06/22 01:23

あ、なるほど!すみません、昨日の私の返信が間違えていました。 頂いたコードでシンプルかつ、網羅できそうですね。 試してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問