オブジェクト指向...

26
オブジェクト指向 プログラミング演習 1 オブジェクト指向と Java 2019.04.11

Transcript of オブジェクト指向...

Page 1: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

オブジェクト指向プログラミング演習

第1回 オブジェクト指向とJava

2019.04.11

Page 2: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

プログラミング学習の段階

⚫ 命令が実行される様子の理解

⚫ 個々の命令の意味の理解

⚫ 一連の命令の並びが、全体として何をしているか理解する

⚫ 計算機にさせたい作業の全体を命令の並びで表現する

⚫ 協働作業で大きなソフトウェアを作る(ソフトウェア工学)

2019.04.11

文法や単語を覚える

長文の読解長文の作文

語学に例えると…

共著で本を書く

隔たり

隔たり

オブジェクト指向が

威力を発揮する範囲

Page 3: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

2019.04.11

本演習の目標

⚫ ひとまとまりのプログラム全体を自力で作る

◆作りたいモノをプログラムとして書き下す過程を学ぶ

◼作りたいモノを明確にする(分析)

◼作りたいモノを構成する部品とその組み合せ方を考える(設計)

◼プログラムとして実現する(実装)

⚫ オブジェクト指向を学ぶ

◆分析や設計から実装まで、対象を同じように考える方法(の一つ)を修得する

◆残念ながら「協働開発」まではいかない

Page 4: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

本演習について

⚫ オブジェクト指向の考え方を学ぶ

⚫ オブジェクト指向の考え方に沿ったプログラミングを学ぶ

◆プログラミング言語としてJavaを使う

⚫ 参考書:

2019.04.11

半田久志 著, "Java と UML で学ぶオブジェクト指向プログラミング", 近代科学社, 2014

Page 5: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

演習室:セキュリティ演習室

各自、自分のノートPCを有線LANにつなげて使う

⚫ ノートPCを必ず持参すること

⚫ 使用する言語は Java

◆VMWare Player と ubuntu のインストールをしておくこと

◆ubuntu に Java の開発環境をインストールしておくこと:

sudo apt-get install default-jdk

◆ubuntu には emacs などのテキストエディタをインストールしておくこと

2019.04.11

Page 6: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

本演習の成績評価について

⚫ 出席(約20%)と演習(約30%)

◆毎回、出席を確認する

◆出席確認はだいたい演習を兼ねる

⚫ 課題(約50%):レポートを課す

◆時間をかけて少し大きめのプログラムを書く課題を出す

◆同じテーマで2回提出(両方出して50%)

⚫ 期末試験は実施しない2019.04.11

去年までとは、やり方を変えました

Page 7: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

今日のお題

⚫ プログラミングという行為の ある一面

⚫ モジュール化

⚫ オブジェクト指向

⚫ Java

2019.04.11

Page 8: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

←これは目標であって、厳密に決める必要はない

プログラミングという行為

手順を曖昧さなく表現する

そのためには?

➡作りたいモノの仕組みを、きちんと理解・決定する

◆どう動くのか?

◆どういう仕組み・手順で、その動きが実現されるのか?

仕組みを理解するためには?

➡作りたいモノを、部品に分ける

◆複雑なモノの全体を一度に理解するのは難しい

◆全体は、どんな部品を、どう組み合わせてできているか?

◆各部品は、どうできているか? 2019.04.11

この二つに大きな違いがあることは学んだはず

仕組みが分からなければ、作れない。「仕組み」が重要。

Page 9: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

プログラムの書き手が考えるべき範囲

⚫ プログラムの全体

部品への分割・組み合わせ方

⚫ その部品

◆さらにその部品…

部品への分割・組み合わせ方

⚫ 用意された部品

◆部品の使い方

◆用意された部品の中身

◼計算方法・OSの機能・ハードウェアの仕組み

⚫ 外部とのやりとり

◆外部=OSやハードウェアの向こう側

◆ユーザ(人間)・他のプログラム 2019.04.11

プログラムに直接反映される。

(内部設計)

プログラムの使い方に関わる。

(外部設計)

知っておくと、• 部品の使い方の

理解が早い。• より良い方法を

考える素養になる

部品とその組み合わせ方が

「仕組み」

• 外部の動作が、それを受け取る部品にどう反映されるか。

• どの部品を使うと外部に情報を提示できるか。

Page 10: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

部品に分けるときの考え方

⚫ プログラムの全体

⚫ プログラムの部品

⚫ 用意された部品

2019.04.11

To

p D

ow

n

Bo

tto

m U

p

※)部品をモジュールと呼び、

全体をモジュールに分けることをモジュール化と呼ぶ

プログラム全体が持つべき機能をもとに、その機能を実現する部品を考える

用意された部品が持つ機能をもとに、その機能を使って実現できる部品を考える

プログラム全体が持つべき機能を

考える

どんな機能が提供されているかを

知っておく

大きなプログラムを書くには、部品を考えることが重要。

プログラムの書き手が部品を決める

用意された部品を使うために必要な情報を準

備する

Page 11: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

分析・設計・実装

分析:やりたいことを整理する

◆どんな機能を持つのか

◆本質(必要最小限の機能)は何か

設計:仕組みを考える

◆外部とどうやりとりするのか(外部設計)

◆どんな部品をどう組み合わせるのか(内部設計)

実装:プログラムを書く

◆設計の通りに…

2019.04.11

大きなプログラムを一気に書くことはできません。設計や実装の優先順位をつけることにも意味があります。

Page 12: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

分析と部品への分け方の例

テトリスを作りたいとする

⚫ 画面を表示したい

◆画面表示という機能が必要

◆あたりまえのことをきちんと意識するのも分析

⚫ 「画面を表示する」部品を考える

◆画面には、盤面とブロックを表示する

◼画面表示の部品は、盤面表示とブロック表示

◼どちらもマスを表示する

マスの表示という部品が共通して使える2019.04.11

プレイヤーではなく、ゲームの方

テトリスのプログラムが持つべき、たくさんの機能のうちの一つ

Page 13: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

2019.04.11

本質的な機能とは?(テトリスの例で)

画面表示は機能の一つ

⚫ 人間がプレイするなら、画面表示が(たぶん)必要

⚫ プログラムがプレイするだけなら、画面表示は不要

◆プログラムに対して状況を伝える手段が必要

テトリスというゲームが本質

⚫ ゲームの状態(盤面やブロック)を管理する機能

◆状態を情報(データ)として記憶する

◆状態を時間経過やプレイヤの操作によって変化させる

…対象を(データで)表現することをモデル化と呼ぶ

➡ 本質的なプログラミングとは:

◆状態をデータで表現すること

◆状態の変化に応じてデータを更新する機能を作る

Page 14: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

プログラムの部品

⚫ 手順を構成する小さな手順

◆C言語の関数

⚫ 手順と、その手順が操作するデータには、密接な関係がある

◆まとめて扱えたら分かりやすい

➡ オブジェクト指向という考え方へ

2019.04.11

抽象データ型という概念

モジュール

Page 15: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

2019.04.11

余談:「設計」について

NHKスペシャル「東京リボーン第1集」の中のセリフ

設計通りに作れることはない。なんとかするのが職人のウデ。

⚫ ソフトウェアでも同じことが言えそう

◆身も蓋もないが、真理だなぁ

◆「…ない。」は言い過ぎかな…

⚫ とは言え設計は大事

◆職人だって設計通りに作れるほうが楽なはず

◆設計通りに作れないのは、設計者の怠慢・勉強不足

◆コードまで見通してソフトウェアを設計すべき

東京五輪に向けた巨大建造物の建築現場の実録

(NHK総合 2018年12月23日21:00放映)

皆さんは修行中の身です。設計を厳密に考えるのは勉強になりますが、そこにこだわって何も作れないよりも、とにかく動くプログラムを自力で書けるようになりましょう。

職人の立場から出た言葉

将来情報系の開発に携わる人が目指すべきは:• なんとかできる優秀な職人(プログラマ)• 優秀なプログラマに無視されない設計者・企画者…どちらにもコミュニケーション能力が必要ではある

Page 16: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

設計が先か実装が先か

本来は設計が先なのだが…

⚫ 作ってみないと分からないこともある

◆分からないまま設計すると「設計通りには作れない」状況になる。

⚫ ソフトウェア工学で言うプロトタイプやスパイラルという開発過程モデル

◆試作してから本番の設計・実装をする開発方法

◆少しずつ機能拡張していく開発方法

⚫ 「プログラムは二度書け」 2019.04.11

ソフトウェアの開発では、特によくあること

Page 17: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

一度目の実装に設計は不要か?

必要。

⚫ 最低限の仕組みを把握することが必要◆とはいえ、作ってみて初めて分かったことによって変更

する可能性がある

…面倒臭がらず、捨てる勇気を持って、設計しなおすことが必要

⚫ 設計は仕組みを 構築/理解 する行為

2019.04.11

Page 18: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

ソースコードにおけるプログラムの部品

ソースコード中で、部品であることが分かるように、ひとまとまりのコードとして書く。

ひとまとまりのコード:

⚫ C言語では

◆たとえば関数の定義

◆プログラム全体を複数のファイルに分けることもある

⚫ オブジェクト指向では…

◆クラスの定義

◆(クラス内の)メソッドの定義

2019.04.11

データと手順をまとめたもの

手順。機能を表す。関数みたいなもの

手順。機能を表す

設計できたとする。プログラム全体は部品に分けられる。

Page 19: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

いったん、まとめ

大きなプログラムを書くには?

⚫ 部品に分けて考える

◆個々の部品

◆部品を組み合わせる

「では設計してね」と言われても難しい

➡ 部品に分けるときに目安となる考え方は?

2019.04.11

モジュール化という。

これを考えるのが(内部)設計

Page 20: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

オブジェクト指向

プログラミングの対象を「モノ」中心に考える

⚫ 「モノ同士の関連づけをプログラムで表現する」という考え方

⚫ 抽象的な概念も、モノとして表すと考えやすくなる

⚫ モノの種類(クラス)と実体(インスタンス)を意識する

◆「手順」は?

◼モノの種類を限定して、それに関連する手順だけを考える

2019.04.11

class instance

Objectオブジェクト

モノを基準にモジュール化する

ということ

Page 21: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

クラス・インスタンス・メソッド

⚫ モノの性質や機能はモノの種類ごとに決まる◆クラス(モノの種類)を定義することがプログラミング

◆二種類の部品

◼そのモノを構成する部品であるモノ

◼そのモノに関する手順の部品である手順

⚫ インスタンスの部品◆他のインスタンス

◼モノ(インスタンス)は、そのモノを表す変数やフィールドで表現される

⚫ メソッドの部品◆部品であるメソッドの呼出し 2019.04.11

Page 22: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

プログラミング言語 Java

⚫ コンパイルを要する

→機械語ではなく、byte code になる

(Java のクラスファイルと呼ぶ)

⚫ byte code インタプリタで実行する

→OSやCPUが違ってもコンパイル後のファイルが実行できる

⚫ オブジェクト指向をサポートしている

→オブジェクト指向のためのキーワードがたくさんある

2019.04.11キーワードを書かなければならないので、ちょっと面倒

Page 23: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

Java ソースファイルの書き方

2019.04.11

⚫ .java のファイルにはクラスの定義を書く。

◆一つのファイル中に複数のクラスの定義を書けるが、public class は一つだけ。

◼ public な class の名前とファイル名を同じにする仕様。

◆ public なクラスは他の .java ファイルから使うことができる… クラスごとに1つのファイルにすることが推奨される

⚫ クラス定義の中身として、フィールドやメソッドを定義する。

◆フィールドは変数のようなもの・メソッドは関数のようなもの

◆ public なフィールドやメソッドは、他クラスから参照できる

◆ static なフィールドやメソッドは、インスタンスが異なってもクラスが同じなら共通(クラス変数・クラスメソッドという)

⚫ 実行時にはクラスを指定する。そのクラスで定義されているmainメソッドが実行の起点

◆ main はクラスメソッドで、文字列の配列を受け取り、返戻値なし

Page 24: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

Javaのソースファイル(概略)

public class XXX {

}

class YYY {

}

class ZZZ {

}

2019.04.11

XXX.java

クラスの定義が並ぶ。class はクラスを定義するためのキーワード

public class の名前とファイル名(の末尾の .java を除く部分)は同じ

クラスの定義の中身(ここでは「…」と略した)には、以下を書く:• フィールドの宣言• メソッドの宣言次回、解説します。

package や import の宣言が入ることもある

Page 25: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

C言語とJava

⚫ どちらも手続き型の言語で、文法がまぁまぁ似ている

◆混乱しやすいので要注意

◆ Cの関数とJavaのメソッドでは、どちらも{…}(ブロック)の中の命令が順番に実行される

◆変数や代入、四則演算の書き方は同じ

◼ int, double などの基本型がある

◼ Javaではクラスを型として使うことができる

◆ if文, for文, while文の書き方もほぼ同じ

◼ Javaは型に厳格なので、条件は boolean型でなければならない

⚫ C言語の関数と Java のメソッドが対応する

◆仮引数の書き方や return文で返戻値を返すことなどはよく似ている

2019.04.11

Page 26: オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2019OOP/OOP01.pdf本演習について オブジェクト指向の考え方を学ぶ オブジェクト指向の考え方に沿った

次回予告

⚫クラス

⚫インスタンス

⚫メソッド

⚫コンストラクタ

2019.04.11