2010年4月27日火曜日

抽象化とは何か?







SWEBOK 2004 に挙がっている Software Design Enabling Techniques の1つ,Abstraction (抽象化) について考察してみました.

僕が考えた抽象化の定義は次の通りです.

抽象化は,(1)複数の具体的な概念や現象の共通性を見いだして,(2)不要な枝葉の情報をそぎ落として一般化し,(3)それに適切な名前をつける行為である.

これら3つの要素が備わらないと抽象化とは呼ばないような気がしました.まず第1に,抽象化の対象は複数あること.もし対象が1つしかなかったら,抽象化する必要はなく,具体的なまま扱えばよろしい.なおかつそれらを共通化して扱いたいという動機がある.第2に,複雑なまま扱うのではなく,ある観点にしたがって不要な情報をそぎ落とすプロセス(捨象)が大事です.そして第3に,あとで再利用できるように適切な名前をつけることが重要です.

そう思って SWEBOK 2004 を読むと, Liskov と Guttag の書籍[Lis01]を引用して次のように書かれています.


Abstraction is "the process of forgetting information so that things that are different can be treated as if they were the same." [Lis01]

僕の訳文は次の通り. 
抽象化とは,複数の異なるものを,あたかも同じものであるかのように扱うために,捨象するプロセスである.
やはり抽象化の対象は複数あり,それらを共通化して扱いたい動機があります.forgetting information を捨象すると訳しましたが,不要な情報をそぎ落とすことですね.ただし,名前をつけることは含まれていないようです.

SWEBOK 2004 によると,抽象化の道具立ては下記の通りです.


In the context of software design, two key abstraction mechanisms are parameterization and specification. Abstraction by specification leads to three major kinds of abstraction: procedural abstraction, data abstraction, and control (iteration) abstraction. [Bas98:c6; Jal97:c5,c6; Lis01:c1,c2,c5,c6; Pre04:c1]
 箇条書きで書くと次のように整理できます.





  • 抽象化(abstraction)
    • パラメーター化(parameterization)
    • 仕様化(specification)
      • 手続き抽象(procedural abstraction)
      • データ抽象(data abstraction)
      • 制御(繰り返し)抽象(control (iteration) abstraction)




これらをそれぞれ教材化すればいいわけですね.さっそく参考書籍をそろえましょう!

SWEBOK 2004
Chapter 3 Section 1.4.1 Abstraction

[Lis01] B. Liskov and J. Guttag, Program Development in Java: Abstraction, Specification, and Object-Oriented Design, Addison-Wesley, 2001.

[Bas98] L. Bass, P. Clements, and R. Kazman, Software Architecture in Practice, Addison-Wesley, 1998.




[Jal97] P. Jalote, An Integrated Approach to Software Engineering, second ed., Springer-Verlag, 1997.

[Pre04] R.S. Pressman, Software Engineering: A Practitioner's Approach, sixth ed., McGraw-Hill, 2004.


Twitter のコメント

2010年4月20日火曜日

教材アーキテクチャ: 原理原則・ケーススタディ レイヤーモデル

ブログは久しぶりですね.第1学期の授業もついに始まってしまいました.でも今日は時間が取れたので,OOP演習の教材開発を再開したいと思います.

以前,OOP演習にスパイラルカリキュラムを適用することを提案しましたが,1つ問題があります.1枚岩で作ってしまうと,用いるケーススタディを変更したときに教材全体を開発し直す必要があるからです.毎年毎年同じケーススタディを行うのは飽きてしまうし,時代や学生さんの関心にケーススタディを合わせる必要があると考えられます.

そこでソフトウェアアーキテクチャの1つであるレイヤーアーキテクチャを適用することを考えました.

レイヤーアーキテクチャ(layered architecture)とは階層アーキテクチャともいい,全体を階層構造にすることで変化に対応させるときの変更箇所を最小限にしようという考え方です.レイヤーアーキテクチャでは,各層のインターフェースをきちんと定義し,下の層を基礎として利用することで,上の層の機能やサービスを実現します.そうすると,インターフェースを守っている限り,1つ1つの階層を入れ替えることが可能になります.

OOP演習では次のような階層構造を考えました.

原理原則層は,教授項目をそれぞれ独立に教材として提供します.たとえば抽象化を学習する教材を,簡単な例題を用いながら説明します.

一方,ケーススタディ層は,大きめの例題を開発し,原理原則層で提供される教材を使いながら,スパイラルカリキュラムを実現します.ケーススタディを入れ替えたとしても,原理原則層は再利用できるというわけです.