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

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

ただいまの
回答率

88.35%

リーダブルコード11章をjavaで説明してください

受付中

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 593
退会済みユーザー

退会済みユーザー

リーダブルコード11章「1度に1つのことを」をjavaで

1章の内容は
・コードはひとつずつタスクを行うようにしなければいけない
・タスクは小さくできる
というものですが、サンプルコードがjavascriptで書かれており、私はまだjavaの知識しかないもので、javaで説明していただきたいです。

サンプルコードと11章内容は以下の通りです。

ブログに設置する投票用のボタンがあり、ユーザーはアップ(賛成)とダウン(反対)を東京で来ます。scoreはすべての投票を合計したもので、アップは1点で、ダウンは-1点となります。

var vote_changed = function (old_vote, new_vote) {
    var score = get_score();

    if (new_vate !== old_vote) {
        if (new_vote === 'Up') {
            score += (old_vote === 'Down' ? 2 : 1);
        } else if (new_vote === 'Down') {
            score -= (old_vote === 'Up' ? 2 : 1);
        } else if (new_vote === '') {
            score += (old_vote === 'Up' ? -1 : 1);
        }
    }
    set_score (score);
}


ここでは、このコードに対して、
1.old_voteとnew_voteを数値にパースする
2.scoreを更新する
という2つのことがなされています。
2つのタスクを別々に行い読みやすいよう以下コードにします。

var vote_value = function (vote) {
    if (vote === 'Up') {
        return +1;
    }
    if (vote === 'Down') {
        return -1; 
    }
    return 0;
}


ここで投票を数値にパースし、

var vote_changed = function (old_vote, new_vote) {
    var score = get_score ();
    score -= vote_value(old_vote);
    score += vote_value(new_vote);
}


これでスコアの更新を行うようにします。


以上javaでのサンプルコードを教えてください。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • miyabi_takatsuk

    2019/10/27 14:32 編集

    え、もしかして、課題押し付けてない?
    このままでは丸投げ以前に、作業依頼ですよね、これ・・・。
    まず、ご自身でやってみて、どうしてもわからないという部分をピンポイントに質問する形にしたほうがいいと思いますよ。
    そして、大変失礼ですが、Javaができるのに、これくらい置き換えられないというのにはいささか違和感があります。
    (JSより、Javaの方が相当理解が難しい言語のはずなので)

    キャンセル

  • cateye

    2019/10/27 19:38

    「はじめに」の「本書について」の“この考えを説明するために”の下りを読んでみて下さい。
    ・・・いかに、質問の内容が的はずれか?・・・・

    キャンセル

  • 退会済みユーザー

    2019/10/28 12:26

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

+1

サンプルのコードは次の段取りで示されています。

(1) 最初に示されているサンプルコードは「投票された値の判定と投票数の増減を行う処理」となっています
(2) 次の二つのサンプルコードは「投票された値の判定」と「投票数の増減の処理」を分けて記述しています

この(2)では「投票数の増減の処理」は「投票された値の判定」を利用してその結果で処理するようになっています。このように「タスクを小さな単位」とする方が良いことを示しています。

ここに書いたように文章で表現したとしても、それぞれが担う役割が明確で、その処理の範囲では注目しなくてはいけない(やらなければいけない)ことが掴みやすくなります。
このことは一つの関数やメソッド(書籍ではタスクという言い方)では一つのことをするという風にも理解できます。そしてそれは書籍の11章の趣旨そのものであり、それをコードで例示しているのです。

その目的はソースコードを人間が読んで理解しやすくすることにあるでしょう。
結果として問題を起こしにくいコードにつながるのだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

Java では説明しません

理由:型宣言がうるさいから。

その書籍は読んだことないですけど、「1度に1つのことを」という文章の意味を考えてみますと、単に「ソースがスパゲッティにならないようにしましょう」ですよ。

「関数の開始行りから終了行までを、画面に収まるようにまとめましょう(昔は画面が小さく「20行程度」と言われてました)」ってことです。

そういう意味ですので、わざわざ関数化する必要はない例ですね。
私なら switch 文を使います。

var vote_changed = function (old_vote, new_vote) {
  var score = get_score();

  if (new_vote !== old_vote) {
    switch( new_vote ) {
    case 'Up':   score += (old_vote === 'Down' ?  2 : 1); break;
    case 'Down': score -= (old_vote === 'Up'   ?  2 : 1); break;
    case '':     score += (old_vote === 'Up'   ? -1 : 1);
    }
  }
  set_score (score);
}

Javaにもある三項演算子

ソース上でカラムを揃えるだけで、「データ」のように見えます。

書籍名だか、本のセクション名だか分かりませんが、「リーダブルコード」で可読性を説く内容なら、switch 文で十分と思いましたねぇ。

if ~ else は時としてうるさくなる。

書籍に書いてあることはあくまでも参考にして、「自分ならこうする。」と考えることが大事じゃないかなぁ。

Java に似た javascript のclass ブロックで書いてみました。

javascript はプロトタイプベースOO な言語ですが、Javaに近い疑似クラスベースOOです。
class ブロックで書けば Java にかなり似るかなと。

  1. javascript は型が代入時に推測決定する / Javaは型を明示しなければならない
  2. javascript はメンバに this を明示しなければならない。(Javaは不要)
  3. Java では明示しなければならないキャスト演算(型変換)が暗黙のうちに行われる。

コードを読む上でのポイントってそれだけでしょうね。

Java は 必ず何かしらのオブジェクトになるので、 Vote としておきます。
この条件で書き換えた結果がこうなりそうです。

import { get_score, set_score } from "./path/to/Score.js";

class Vote {

  constructor() {
  }

  vote_changed(old_vote, new_vote) {
    var score = get_score ();
    score -= this.vote_value(old_vote);
    score += this.vote_value(new_vote);
  }

  vote_value(vote) {
    if (vote === 'Up') {
      return +1;
    }
    if (vote === 'Down') {
      return -1; 
    }
    return 0;
  }
}

書籍通りなら誤植ですね。
ストレージに書き込まない状態になっています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/01 21:30 編集

    読んでから回答するのがいいと思います

    キャンセル

  • 2019/11/02 12:01

    仰るとおりです。

    キャンセル

-2

これで読めないのならJavaで書いても読めないように思うので、頑張って読み解くか、もう少し力をつけてから読み直すのが良いのではないかな、、と思います。

あとは、練習用に自分で書き換えてみては・・?
その上で動かない、という質問であれば答えやすいかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る