オブジェクト指向プログラミングのメモ書き

2010. 02. 16
次は難解なオブジェクト指向プログラミングについてです。
オブジェクト指向ほど『何度も見聞きしているけど理解できないもの』はないってくらいです。
私も未だに理解していませんが、必要最低限のポイントを抑える道標を探ってみたいと思います。

●オブジェクト指向の概念は調べない

Wikipediaのオブジェクト指向を見てみると、『オブジェクト指向プログラミングから始まり、システム開発の分析や設計にも広がっている』とあります。

それらを包括するような概念を話されても抽象的過ぎて分かりませんし、定義自体が酷く曖昧なので混乱の元になります。

試しに『オブジェクト指向』でググると上位にくるサイトを例に取ると、

・『オブジェクト指向は難しくない!
オブジェクト指向は業務分析や要求定義などの上流行程もカバーする

・『5分で絶対に分かるオブジェクト指向
オブジェクトは責務を持ち、メッセージにより強調動作する自律分散協調モデルです

と、プログラミングに直接関係無い説明が為されたり、分かり易くしようと例えた比喩に惑わされたりします。

必要なのはプログラミングに関する話なので、オブジェクト指向そのものの概念は追求しない方がいいと思われます。

●Objective-C言語以外のプログラミング言語は調べない

一口にオブジェクト指向プログラミングといっても、C++、Java、Perl、Delphiなどなど、メジャーからマイナーまで多数の言語があります。

問題なのは、着想は同じでも設計思想や実装方法が異なるため、クラスやメッセージ、メソッド、インスタンスなど、同じ単語を用いて説明していてもプログラミング手法として互換性が無い点です。

既に習得されている方はともかく、プログラミング未経験の方はObjective-C言語以外の情報は仕入れない方がいいと思います。

そうすると見るべき資料が格段に少なくなりますし(世間一般ではマイナーな言語なので)、無用の混乱を未然に防ぐこともできます。

つまり『Objective-C言語を通してオブジェクト指向とプログラミングを考える』ことに特化すれば、少しは見通しが立つと思われます。

●あらためて『オブジェクト指向』とは

上記のようにオブジェクト指向を難解たらしめているのは、

・風呂敷を広げすぎた抽象的な概念
・専門用語を駆使した伝える気が無さそうな解説
・もしくは比喩を多用しプログラミングと乖離した解説

にあると言えます。

色々調べてみましたが、プログラミングを始めようという読者側の立場を理解し、具体的かつ比喩の少ない、カワサキタカシさんの『Objective-C入門番外編:オブジェクト指向って何だろう?』の説明が分かり易いです。

上記の記事を元にオブジェクト指向を要約すると、

楽をしたい=オブジェクト指向

同じような(ほとんど同じだけど一部異なる)作業を繰り返す。
尚かつそれが複数あって個々に動かしたい。
その為にそれぞれコードを書くのは面倒なので、基本となるコードを1個作って、後は異なる部分だけを書き換えて使えるようにしよう・・・というのが動機となり、

基本となるコード(設計図)クラス
設計図を元に作ったモノ(実物)インスタンス
基本となる動作の内容メソッド
個別の指示メッセージ

と考え、クラスやインスタンスというモノを『オブジェクト』と呼び、プログラムを『オブジェクトに対するメッセージとして記述』しようというのがオブジェクト指向です。多分。

●オブジェクト(Object)とメッセージ(Message)

・オブジェクトは変数とメソッドを内包したクラス、およびインスタンスのこと
・オブジェクトが他のオブジェクトに働きかけることをメッセージと呼ぶ
・オブジェクト同士がメッセージをやりとりすることでプログラムが動く

●クラス(Class)とインスタンス(Instance)

・クラスは設計図
・設計図を元に作った実物の製品がインスタンス
・一つのクラスからインスタンスは複数作ることが可能

●クラスの継承(Inheritance)

・あるクラスを元に一部を改変した新しいクラスを作ることができる
・元のクラスをスーパークラス(Superclass)と呼ぶ
・一部改変し、それ以外の特性を受け継いだクラスをサブクラス(Subclass)と呼ぶ
・サブクラスからサブクラスを作ることもできる
・複数のスーパークラスからサブクラスを作る多重継承はObjective-Cにはできない

●変数(Variable)とメソッド(Method)

・変数はC言語と同様、何らかの値を保持するもの
・メソッドはオブジェクトが内包するC言語でいう関数のようなもの
・オブジェクトにメッセージを送ると、そのメッセージに対応するメソッドが応答する
・オブジェクト内部の状態や動作を隠蔽することをカプセル化(Encapsulation)という
・サブクラスがスーパークラスと同名のメソッドを記述して機能を上書きすることをオーバーライドと呼ぶ



参考文献

サルにもできるiPhoneアプリの作り方 Step2/Objective-C入門番外編:オブジェクト指向って何だろう?

iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩
(2009/03/18)
赤松 正行

商品詳細を見る





SoundSport Pulse wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
Sun Mon Tue Wed Thu Fri Sat
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

SoundSport Pulse wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR