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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

579閲覧

コードのifやelseを減らしてきれいにしたい

TTaro

総合スコア7

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2020/12/21 07:01

タイトルの通り,elseやifが多いコードをきれいにしたいです.
コードを見てください.

JavaScript

1process.stdin.resume();  2process.stdin.setEncoding('utf8'); 3 4let R = "D" 5let W = "D" 6let winner = "B"; 7 8let lines = []; 9let reader = require('readline').createInterface({ 10 input: process.stdin, 11 output: process.stdout 12}); 13reader.on('line', (line) => { 14 lines.push(line); 15}); 16reader.on('close', () => { 17 for(let i = 0; i < lines.length; i++){ 18 if(lines[i] == "RD"){ 19 if(R == "D"){ 20 winner = "A" 21 }else{ 22 R = "U" 23 } 24 }else if(lines[i] == "RU"){ 25 if(R == "U"){ 26 winner = "A" 27 }else{ 28 R = "U" 29 } 30 }else if(lines[i] == "WD"){ 31 if(W == "D"){ 32 winner = "A" 33 }else{ 34 W = "D" 35 } 36 }else if(lines[i] == "WU"){ 37 if(W == "U"){ 38 winner = "A" 39 }else{ 40 W = "U" 41 } 42 } 43 } 44 console.log(winner) 45});

これは,旗上げゲームです.

標準入力で赤白の旗(R,W)を上げるか下げるか(U,D)の命令を適当な数入力します.

最初は赤白両方の旗を下げている状態で初めて,命令に間違いがあった場合(旗が下がっているのに下げる命令をする等)はAがwinnerになり,間違った命令をしなかった場合はBがwinnerになります.

コードのelseやifがごちゃごちゃしていて気になるのですが,どのように改善すればよいかわからず質問させていただきました.

解答の程よろしくお願いします.

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

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

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

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

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

stdio

2020/12/21 08:58

個人的には、貴方のコードのごちゃごちゃ感は味があって良いと思いますよ。
hentaiman

2020/12/21 10:14

それが気になるので改善したいようですが。
miyabi_takatsuk

2020/12/21 11:03

回答しといてなんですが、十中八九paizaとかですよね。
TTaro

2020/12/22 05:20

ある企業のインターンの選考で,このようなコードを書けという問題が出て,自分で回答したものがごちゃごちゃしていたのでうまい人はどのように書くのだろうかと思って質問しました. 問題の内容を具体的に書いてしまいました. もう少しぼかして書くべきでした. すみませんでした.
miyabi_takatsuk

2020/12/22 05:38

> もう少しぼかして書くべきでした. すみませんでした. それは… そうですね、選考問題なら、尚更問題文出しちゃまずいですね。 選考員とかもエンジニアなら、teratailはけっこう見られてます。 今回は、自身のコードで動くものなので、いいのかな?と思いますが、 いらぬ誤解を生んで、質問者さんの不利益になる可能性が十分あります。
guest

回答2

0

ベストアンサー

ふむ、paizaっぽいのでアウトっぽく見えますが、
自力で動作するようなコードが書けているようなのでセーフとみなして回答します。

ブラウザのデベロッパーツールやNode.jsのREPLで
下記のコードを試してみましょう。

> ("RD")[0] "R" > var [a, b] = "RD" "RD" > a "R" > b "D"

このようにJavaScriptの文字列(String)は
日本語のようなマルチバイト文字さえ絡まなければ、
配列のように1文字ずつ取り出す事が可能です。


次に、変数は文字から探すと骨が折れます。
これがif文だらけになる主原因です。

ここは汎用オブジェクトを作って
キー名で管理するようにしましょう。

> state = {R: "D", W: "D"} > state.R "D" > state["R"] "D" > color = "R" "R" > state[color] "D" > state[color] = "U" "U" > state {R: "U", W: "D"}

これで"R""W"の文字から値を読み書き出来るようになります。


最後にfor文で作られるiはどうせ不要なので、
既に何かしらの配列が存在して1個ずつアイテムを抜き出す構造にする場合
for...ofを使いましょう。

ただし、これは単純にコードが10倍簡素になり読みやすくなる程度の効果しかありません。


上記3点を全て含めたコードがこちら
制御の為にif文を2個追加しましたが、
コア部分の重複は抑えられ、まぁまぁ短くスッキリした見た目になったかと思います。

js

1const state = { 2 R: "D", 3 W: "D" 4}; 5let winner = "B"; 6 7reader.on('close', () => { 8 for (const line of lines) { 9 const [color, order] = line; 10 // 無効となる命令を取り除く 11 if (color != "R" && color != "W") continue; 12 if (order != "D" && orser != "U") continue; 13 if (state[color] == order) { 14 winner = "A"; 15 break; // 負け確定後は検証する意味がないのでループを抜ける 16 } 17 state[color] = order; 18 } 19 console.log(winner); 20});

書きづらい時は事前準備で工夫する。
これを意識するようにしてみてください。

投稿2020/12/22 04:18

編集2020/12/22 04:36
miyabi-sun

総合スコア21203

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

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

miyabi_takatsuk

2020/12/22 05:58

> JavaScriptの文字列(String)は 日本語のようなマルチバイト文字さえ絡まなければ、 配列のように1文字ずつ取り出す事が可能です。 (勉強になりました)
miyabi-sun

2020/12/22 06:15

因みにJSはUTF-8でやっているので、 マルチバイトも意外と頑張れる仕様なんだけど 絵文字のような5バイト文字はES5までの仕様だと使えないのかな? ES2015以降に追加された機能だとイケるみたいな裏事情があります ``` > ("????????")[0] "�" // <- 化けてしまった…… > [a, b] = "????????" "????????" > a "????" > b "????" ```
guest

0

javascript

1class HandStruct { 2 constructor(color, action = 'D') { 3 this.color = color; 4 this.action = action 5 } 6 exchange(actionFlg) { 7 this.action = actionFlg ? 'U' : 'D'; 8 } 9} 10 11const Player = { 12 R: new HandStruct('R'), 13 W: new HandStruct('W') 14}; 15 16// 中略 17 18reader.on('close', () => { 19 20let winner = ""; 21 22const programs = lines.map( a => { 23 const aarr = a.split(""); 24 return new HandStruct(aarr[0], aarr[1]); 25}); 26 27programs.some(p => { 28 if ( Player[p.color].action == p.action ) { 29 winner = 'A'; 30 return true; 31 } else { 32 winner = 'B'; 33 Player[p.color].exchange(p.action == 'U'); 34 } 35}); 36 37console.log(winner); 38 39});

投稿2020/12/21 07:39

編集2020/12/21 07:43
miyabi_takatsuk

総合スコア9555

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

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

miyabi_takatsuk

2020/12/22 05:43

整理するコツは、同じような処理は二度と書かない、という事を意識することです。 メンテナンス時も、修正箇所が減り、メンテナンス性を向上できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問