Ruby③ オブジェクト指向とはじめての設計(宇野 るいも arton)|翔泳社の本
  1. ホーム >
  2. 書籍 >
  3. Ruby③ オブジェクト指向とはじめての設計

Ruby③ オブジェクト指向とはじめての設計



形式:
書籍
発売日:
ISBN:
9784798118017
定価:
2,178(本体1,980円+税10%)
仕様:
B5変・304ページ
カテゴリ:
プログラミング・開発
キーワード:
#プログラミング,#開発環境,#開発手法,#Web・アプリ開発

Rubyのオブジェクト指向がひとつひとつわかる!

本書は、初めてプログラミングを体験するという方に向けた入門書の第3巻です。 みなさんが学んできたプログラミングの基本をもとに、Rubyのオブジェクト指向プログラミングをやさしく解説します。
オブジェクト指向と聞くと難しそうですが、心配はいりません。クラスの定義はもちろん、「カプセル化」「継承」「ポリモーフィズム」といったオブジェクト指向の基礎となる考え方からしっかりわかります。
そのほか、デザインパターンやプログラムのテスト、フレームワークの作り方など、これから本格的なプログラムを作るのに知っておきたい必須知識も、たくさんのサンプルプログラムで学習。Rubyを柔軟でパワフルな言語としているメタプログラミング機能にも触れます。
各章に小問題や章末の練習問題があり、自分ひとりでプログラムを作る力が身についたことを確認できます。また、Rubyプログラムを実行する環境も、付属のCD-ROMで簡単に用意することができます。
本書を片手に、プログラミングの新たなステップを踏み出してみましょう。

●付属CD-ROMのご案内

本書の付属CD-ROMには、実習に使用するRubyプログラムの実行環境を構築するためのインストーラパッケージや、本文で作成したサンプルプログラムなどが収録されています。



・- readme.txtファイル
この「付属CD-ROMのご案内」をテキストファイルにしたものです。
・- RubyInstallerについて
Ruby-1.9インストーラパッケージ「Ruby-1.9.1.msi」が収録されています。対応OSは、Windows XP以降(Vistaを含む)です。
・- Samplesディレクトリ
本書で作成するサンプルプログラムを章ごとに収録しています。小問題や練習問題で作成するプログラムは収録していません。
また、穴埋め問題などで使用するプログラムは、穴を開けたまま収録しています。

第1章 古典的なオブジェクト指向プログラミング

1-1 クラスの定義
手続き型からオブジェクト指向へ
クラスの役割と考え方
initializeメソッドとインスタンス変数
属性とアクセサメソッド
値オブジェクト

1-2 メソッドの作成
オブジェクト指向プログラミングの考え方
メソッドの設計
クラス定数・述語メソッド・self
メソッドのアクセス制御
まとめ
練習問題

第2章 継承とポリモーフィズム

2-1 クラスの継承
より進んだカプセル化
オブジェクトの区別は残った
クラスの継承
基底クラスのメソッドの利用

2-2 ポリモーフィズム
ポリモーフィズムとは
継承の問題点とダックタイピング
まとめ

練習問題

第3章 デザインパターン(1)

3-1 継承とテンプレートメソッドパターン
基本的な論理素子
論理素子のシュミレータを作る
継承によって重複を取り除く
テンプレートメソッドパターン
エラー処理を追加する
足し算を行う回路

3-2 オブザーバパターン
端子クラスの導入
yield制御構造
オブザーバパターン
Terminalクラスを使った回路の実装
クラスの責務と分割
論理素子の名前を保持する
新しい半加算器の実装

3-3 コンポジットパターン
全加算器の作成
3ビット加算器の作成
まとめ

練習問題

第4章 デザインパターン(2)

4-1 事象をオブジェクトとして扱う
論理素子の延長
イベント
テスターの作成

4-2 処理をオブジェクトとして扱う
コマンドパターン
順序付きリストとは
コマンドに大小関係を定義する
順序付きリストの実装
動的回路シュミレータ

4-3 ライブラリ化
ライブラリ化と名前空間
ファクトリパターン
共通部分の抜き出しとエラー処理
まとめ

練習問題

第5章 アプリケーションとフレームワーク

5-1 簡単なWebサーバーのプログラミング
ソケットの利用
HTTPリクエストの内容
HTTPレスポンスの内容
Webサーバーの仕組み

5-2 フレームワークの開発
オブジェクト指向プログラミングとフレームワーク
フレームワークの作成
クラス・モジュール自身のメソッド
まとめ

練習問題

第6章 ユニットテストとテスト駆動開発

6-1 ユニットテスト
ユニットテストプログラムとは
機能検証の方法
テスティングフレームワークの利用

6-2 テスト駆動開発
テストファーストとテスト駆動開発
テスト駆動開発の準備
テスト駆動開発の実践
リファクタリング
まとめ

練習問題

第7章 メタプログラミング

7-1 動的プログラミング
メタプログラミングと動的プログラミング
静的なプログラムで動的な処理を実現する
動的なプログラミングで動的な処理を行う

7-2 リフレクションの利用
リフレクションとは
オブジェクトの情報を操作する
Object・Module・Class
まとめ

練習問題

本書は付属データの提供はございません。

お問い合わせ

内容についてのお問い合わせは、正誤表、追加情報をご確認後に、お送りいただくようお願いいたします。

正誤表、追加情報に掲載されていない書籍内容へのお問い合わせや
その他書籍に関するお問い合わせは、書籍のお問い合わせフォームからお送りください。

利用許諾に関するお問い合わせ

本書の書影(表紙画像)をご利用になりたい場合は書影許諾申請フォームから申請をお願いいたします。
書影(表紙画像)以外のご利用については、こちらからお問い合わせください。

追加情報はありません。

ご購入いただいた書籍の種類を選択してください。

書籍の刷数を選択してください。

刷数は奥付(書籍の最終ページ)に記載されています。

現在表示されている正誤表の対象書籍

書籍の種類:

書籍の刷数:

本書に誤りまたは不十分な記述がありました。下記のとおり訂正し、お詫び申し上げます。

対象の書籍は正誤表がありません。

最終更新日:2012年05月25日
発生刷 ページ数 書籍改訂刷 電子書籍訂正 内容 登録日
1刷 012~013
p.12 一番下の行~p.13 先頭行
ス変数に対して、リーダメソッドを用意します。

attr_reader インスタンス変数名のシンボル [, インスタンス変数名のシンボル ……]

ス変数に対して、ライタメソッドを用意します。

attr_writer インスタンス変数名のシンボル [, インスタンス変数名のシンボル ……]

2012.05.25
1刷 013
上から3行目
ス変数に対して、ライタメソッドを用意します。

attr_writer インスタンス変数名のシンボル [, インスタンス変数名のシンボル ……]

ス変数に対して、リーダメソッドを用意します。

attr_reader インスタンス変数名のシンボル [, インスタンス変数名のシンボル ……]

2012.05.25
1刷 023
下から3行目
分のwin?メソッドの呼び出しで、56行目は自分を引数としてotherオブジェクトのwin?メソッドの呼び出しです。
分のjudgeメソッドの呼び出しで、56行目は自分を引数としてotherオブジェクトのjudgeメソッドの呼び出しです。
2012.05.25
1刷 027
「COLUMN」の8行目
~58行目のメイン処理が、janken_game_2.rbでは103~109と3分の1に
~58行目のメイン処理が、janken_game_2.rbでは103~109行目と3分の1に
2012.05.25
1刷 027
「COLUMN」の12行目
janken_gamen_2.rbではメイン処理は6行分の内容。
janken_gamen_2.rbではメイン処理は7行分の内容。
2012.05.25
1刷 075
リスト3-2の2行目
※Ruby 1.9.2 以降をご使用の方のみ該当 ※本書付属CD-ROMで Ruby 1.9.1 をインストールした方は該当しません(修正なしで動作します)

require "not"

require_relative "not"



補足 Ruby-1.9.2 以降の require の仕様変更について


 require にプログラム名を指定した場合の動作が、Ruby 1.9.2 から変更されました。これは、意図せずに、ライブラリで提供されているプログラムの代わりに、現在のディレクトリ上のプログラムを読み込んでしまうことを防止するためです。
 このため、Ruby 1.9.2 以降を利用すると、本書のプログラムのうち、require を利用して同じディレクトリ上のプログラムを参照しているものは、正しく動作しなくなります。たとえば、P.75 のリスト3-2 などがこれにあたります。
 そのため、本書のリストの通りに記述すると、LoadError という例外が発生します。
 Ruby 1.9.2 以降を利用して現在のディレクトリのプログラムを読み込むには、次の2種類のいずれかの方法を利用してください。


  1. Ruby 1.9.2 から新設された require_relative を利用する

  2.  require_relative は、相対ディレクトリ指定でプログラムを読み込むことを指定する関数です。このため、プログラム名を指定して呼び出すと、現在実行しているプログラムと同じディレクトリ上のプログラムを読み込みます。
     require_relative を使ってリスト3-2 を書き直すと、以下の記述となります。


    require_relative "not"


  3. 現在のディレクトリのプログラム読み込みを明示する

  4.  現在のディレクトリ上のプログラムであることを "./" ()を付加して示します。
     ディレクトリを指定してリスト3-2 を書き直すと、以下の記述となります。


    require "./not"




 どちらの方法でも動作しますが、現在実行しているプログラムの仲間であることが明らかに示される require_relatvie を利用することをお勧めします。

 「.」は現在のディレクトリを示すキーワードで、「/」は Ruby が標準で利用するディレクトリの区切り記号です。なお、 Windows のディレクトリ区切り記号は「¥」ですが、 Ruby は他の OS に合わせて「/」を利用します。
2012.05.25
1刷 095~142
第3章リスト3-17以降、ならびに第4章のputs関数を含むリスト
※下記のような呼び出しの引数を囲む括弧のない puts 関数 ※エラーにはなりません

puts "t2 = #{t2.state}"

puts("t2 = #{t2.state}")


 Rubyでは、メソッド呼び出しの引数を囲む括弧を省略できます。
  (『プログラミング学習シリーズ Ruby (2)』のP.63 注2-2より)
2012.05.25
1刷 105
リスト3-27 stage05/not.rb
# encoding: cp932

require "primitive-logic-device"

class Not < PrimitiveLogicDevice
……(以下、stage04/not.rbと同じ)
# encoding: cp932

require "primitive-logic-device"

class Not < PrimitiveLogicDevice
    def initialize(name)
        super(name, 1, 1)
    end
……(以下、stage04/not.rbと同じ)

付属CD-ROMに収録されているstage05/not.rbは修正されています。
2010.05.28
1刷 106
リスト3-28
# encoding: cp932

require "primitive-logic-device"

class Or < PrimitiveLogicDevice
……(以下、stage04/or.rbと同じ)
# encoding: cp932

require "primitive-logic-device"

class Or < PrimitiveLogicDevice
    def initialize(name, input_count)
        super(name, input_count, 1)
    end
……(以下、stage04/or.rbと同じ)

付属CD-ROMに収録されているstage05/or.rbは、修正されています。
2010.05.28
1刷 106
リスト3-29
# encoding: cp932

require "primitive-logic-device"

class And < PrimitiveLogicDevice
……(以下、stage04/and.rbと同じ)
# encoding: cp932

require "primitive-logic-device"

class And < PrimitiveLogicDevice
    def initialize(name, input_count)
        super(name, input_count, 1)
    end
……(以下、stage04/and.rbと同じ。ただし、12行目は次のように修正)             if t.state != 1

【2012/05/28に再訂正】

付属CD-ROMに収録されているstage05/and.rbは、修正されています。
なお、stage05/and.rbの12行目は、stage04/and.rbの12行目と同様に、

        if t.state == 0

としても動作します。


12行目の修正について補足

端末の初期状態は nil (1 でも 0 でもない値)にしてあります。これは値として 0 もしくは 1 が設定された場合にオブザーバパターンで「変化があった」ことを検出するためです。
しかし、端末の状態に何も設定されない状態で読み出される場合もあるので、nil の場合は 0 と見なすことにします。このため、条件を if t.state != 1 としました。
2010.05.28
1刷 106
リスト3-30
# encoding: cp932

require "primitive-logic-device"

class Xor < PrimitiveLogicDevice
……(以下、stage04/xor.rbと同じ)
# encoding: cp932

require "primitive-logic-device"

class Xor < PrimitiveLogicDevice
    def initialize(name, input_count)
        super(name, input_count, 1)
    end
……(以下、stage04/xor.rbと同じ)

付属CD-ROMに収録されているstage05/xor.rbは、修正されています。
2010.05.28
1刷 113
リスト3-36の3行目
three_bit_adder = ThreeBitAdder.new('ThreeBitAdder')
three_bit_adder = ThreeBitAdder.new("ThreeBitAdder")

 ここでは、文字列の指定に「"」(ダブルクォーテーション)ではなく「'」(シングルクォーテーション)を利用しています。「'」は「"」と異なり式展開が無効となる、「¥」を利用した特殊文字入力ができないなどの違いがあります。
2012.05.25
1刷 116
練習問題 3.1
※この問題を解く場合の注意点を追加いたします。
 この問題を解くために、プログラムに and や or といった変数名を利用すると、SyntaxError 例外となります。 これらの単語は、Rubyの予約語(Rubyが特別な利用方法をするために予約している=プログラムでは利用できない)だからです。 どのような語が予約されているかについては、下記のWebサイトをご覧ください。 ■字句構造「予約語」 http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2flexical.html#reserved
2012.05.25
1刷 117
リスト3-37の実行結果
[0, 0, 0, 0] => [0] [1, 0, 0, 0] => [0]  ……(中略)…… [0, 1, 1, 1] => [0] [1, 1, 1, 1] => [1]
[0, 0, 0, 0, 0, 0] => [0, 0, 0, 0] [1, 0, 0, 0, 0, 0] => [0, 1, 0, 0] [0, 1, 0, 0, 0, 0] => [0, 1, 0, 0] [1, 1, 0, 0, 0, 0] => [1, 0, 0, 0] [0, 0, 1, 0, 0, 0] => [0, 0, 1, 0] [1, 0, 1, 0, 0, 0] => [0, 1, 1, 0] [0, 1, 1, 0, 0, 0] => [0, 1, 1, 0] [1, 1, 1, 0, 0, 0] => [1, 0, 1, 0] [0, 0, 0, 1, 0, 0] => [0, 0, 1, 0] [1, 0, 0, 1, 0, 0] => [0, 1, 1, 0] [0, 1, 0, 1, 0, 0] => [0, 1, 1, 0] [1, 1, 0, 1, 0, 0] => [1, 0, 1, 0] [0, 0, 1, 1, 0, 0] => [0, 1, 0, 0] [1, 0, 1, 1, 0, 0] => [1, 0, 0, 0] [0, 1, 1, 1, 0, 0] => [1, 0, 0, 0] [1, 1, 1, 1, 0, 0] => [1, 1, 0, 0] [0, 0, 0, 0, 1, 0] => [0, 0, 0, 1] [1, 0, 0, 0, 1, 0] => [0, 1, 0, 1] [0, 1, 0, 0, 1, 0] => [0, 1, 0, 1] [1, 1, 0, 0, 1, 0] => [1, 0, 0, 1] [0, 0, 1, 0, 1, 0] => [0, 0, 1, 1] [1, 0, 1, 0, 1, 0] => [0, 1, 1, 1] [0, 1, 1, 0, 1, 0] => [0, 1, 1, 1] [1, 1, 1, 0, 1, 0] => [1, 0, 1, 1] [0, 0, 0, 1, 1, 0] => [0, 0, 1, 1] [1, 0, 0, 1, 1, 0] => [0, 1, 1, 1] [0, 1, 0, 1, 1, 0] => [0, 1, 1, 1] [1, 1, 0, 1, 1, 0] => [1, 0, 1, 1] [0, 0, 1, 1, 1, 0] => [0, 1, 0, 1] [1, 0, 1, 1, 1, 0] => [1, 0, 0, 1] [0, 1, 1, 1, 1, 0] => [1, 0, 0, 1] [1, 1, 1, 1, 1, 0] => [1, 1, 0, 1] [0, 0, 0, 0, 0, 1] => [0, 0, 0, 1] [1, 0, 0, 0, 0, 1] => [0, 1, 0, 1] [0, 1, 0, 0, 0, 1] => [0, 1, 0, 1] [1, 1, 0, 0, 0, 1] => [1, 0, 0, 1] [0, 0, 1, 0, 0, 1] => [0, 0, 1, 1] [1, 0, 1, 0, 0, 1] => [0, 1, 1, 1] [0, 1, 1, 0, 0, 1] => [0, 1, 1, 1] [1, 1, 1, 0, 0, 1] => [1, 0, 1, 1] [0, 0, 0, 1, 0, 1] => [0, 0, 1, 1] [1, 0, 0, 1, 0, 1] => [0, 1, 1, 1] [0, 1, 0, 1, 0, 1] => [0, 1, 1, 1] [1, 1, 0, 1, 0, 1] => [1, 0, 1, 1] [0, 0, 1, 1, 0, 1] => [0, 1, 0, 1] [1, 0, 1, 1, 0, 1] => [1, 0, 0, 1] [0, 1, 1, 1, 0, 1] => [1, 0, 0, 1] [1, 1, 1, 1, 0, 1] => [1, 1, 0, 1] [0, 0, 0, 0, 1, 1] => [0, 0, 1, 0] [1, 0, 0, 0, 1, 1] => [0, 1, 1, 0] [0, 1, 0, 0, 1, 1] => [0, 1, 1, 0] [1, 1, 0, 0, 1, 1] => [1, 0, 1, 0] [0, 0, 1, 0, 1, 1] => [0, 1, 0, 0] [1, 0, 1, 0, 1, 1] => [1, 0, 0, 0] [0, 1, 1, 0, 1, 1] => [1, 0, 0, 0] [1, 1, 1, 0, 1, 1] => [1, 1, 0, 0] [0, 0, 0, 1, 1, 1] => [0, 1, 0, 0] [1, 0, 0, 1, 1, 1] => [1, 0, 0, 0] [0, 1, 0, 1, 1, 1] => [1, 0, 0, 0] [1, 1, 0, 1, 1, 1] => [1, 1, 0, 0] [0, 0, 1, 1, 1, 1] => [0, 1, 1, 0] [1, 0, 1, 1, 1, 1] => [1, 0, 1, 0] [0, 1, 1, 1, 1, 1] => [1, 0, 1, 0] [1, 1, 1, 1, 1, 1] => [1, 1, 1, 0]
2012.05.25
1刷 266
(2) stage02/and.rb
※2行目に必要な require 関数が抜けています。
※下記のように require 関数を追加します。

# encoding: cp932 require "logic-device" class And < LogicDevice

2012.05.25
1刷 266
(2) stage02/xor.rb
※2行目に必要な require 関数が抜けています。
※下記のように require 関数を追加します。

# encoding: cp932 require "logic-device" class Xor < LogicDevice

2012.05.25
1刷 266
(3) stage04/and.rb
※2行目に必要な require 関数が抜けています。
※下記のように require 関数を追加します。

# encoding: cp932 require "logic-device" class And < LogicDevice

2012.05.25
1刷 266
(3) stage04/and.rbの8行目
if t.state == 0
if t.state != 1
2012.05.25
1刷 267
(3) stage04/xor.rb
※2行目に必要な require 関数が抜けています。
※下記のように require 関数を追加します。

# encoding: cp932 require "logic-device" class Xor < LogicDevice

2012.05.25
1刷 267
練習問題 3.1) xor.rbの11行目
o = Or.new(name + ".Xor(0)", 2)
o = Or.new(name + ".Or(0)", 2)
2012.05.25

感想・レビュー

baboocon さん

2016-06-09

超速読で読了。このシリーズはソースコードが独特ながら充実しているのがいいですね。入門書でテストにも触れられているのは少ないかも?

ひじき さん

2015-01-31

オブジェクト指向を集中的に学ぶ本ではなく、オブジェクト指向に関係する様々なプログラミングスキルを向上させるための本だと思った。 特にテストに関する章は役立った。

parkplace さん

2013-06-07

後半はわからないところもあったが、ユニットテストなどアマチュアではわからないところも解説していて好感が持てた