オブジェクト指向

吉田誠一のホームページ   >   ソフトウェア工学   >   技術コラム

オブジェクト指向の概念や思想、オブジェクト指向的なソフトウェアの設計手法、実装のノウハウなど、オブジェクト指向技術全般について紹介します。

ISP-JOURNAL Vol.9 技術コラム
オブジェクト指向プログラミングとJava言語

補遺:2006年7月17日

本稿では、オセロゲームを作成するというテーマを例として、オブジェクト指向言語であるJava言語を使ったオブジェクト指向プログラミングの特徴と、従来の手続き型アプローチとの違いについて述べる。 ................

オブジェクト指向の現実

作成:2005年11月5日

オブジェクト指向が広まり始めた頃は、オブジェクト指向のメリットとして、夢のような話がたくさん喧伝された。だが現実には、オブジェクト指向を取り入れても、あらゆる問題が解決する訳ではない。むしろ、オブジェクト指向を導入することで、深刻なデメリットがもたらされることもある。

それでも、高い技術力をもって、大規模で複雑なソフトウェアを開発するチームでは、オブジェクト指向はたいへん有力であり、必須のスキルである。 ................

クラス設計の考え方

作成:2004年4月20日

ソフトウェアの開発において、クラスの設計は、大切なポイントの1つです。いくらオブジェクト指向言語を使って開発していても、クラス設計の考え方が誤っていれば、まったくオブジェクト指向的でないソフトウェアができてしまいます。 ................

カプセル化とは何か 〜仕様と実装は別物です〜

作成:2008年1月18日

オブジェクト指向の特徴の1つに、カプセル化があります。カプセル化によって、利用者は、中身の詳しい作りを知らなくても、その振る舞いだけを知っていれば、クラスを利用することができます。

カプセル化によって、クラスの仕様と実装は、まったく別物となります。振る舞いの仕様を満たしていれば、中身をどのように実装しようとも自由です。そのため、時には仕様と実装が大きくかけ離れたクラスができることもあります。

ここでは、具体的な例を見ながら、クラスの仕様と実装の違いを考えてみましょう。 ................

「いつもソートされたリスト」は「リスト」と言えるか?

作成:2008年1月28日

オブジェクト指向言語では、親クラスが持つメソッドを、子クラスでオーバーライドして、動きを変えることができます。同じメソッドでも、子クラスごとに違った動作をすることを、ポリモーフィズム(多態性)と呼びます。

多くの人に継承される抽象クラスやインターフェースを作る時は、個々のメソッドの仕様だけでなく、クラス全体の仕様も、きちんと決めておく必要があります。それが曖昧になっていると、子クラスごとに勝手な解釈をしてしまうことになり、ポリモーフィズムが破綻してしまいます。 ................

誕生日に学ぶオブジェクト指向

作成:2006年6月6日

ネットには、今日が誕生日の有名人を教えてくれるサイトがある。こういうサービスは、誕生日のデータをたくさん持っていて、今日の日付と比べて、一致すれば表示するようになっている。

誕生日が一致する人を探すプログラムを作るのは、そんなに難しくはない。だが、単に動くだけのプログラムを作るのではなく、オブジェクト指向的にうまく設計しようとすれば、話は別だ。たとえ、誕生日という単純で身近なデータでも、オブジェクト指向的な考えやモデルをうまくクラスとして表現するのは、意外と難しい。 ................

並べ替えのクラス設計

作成:2008年4月10日

データの並べ替えは、たくさんのソフトウェアで必要となる機能です。しかし、ソフトウェアを作るたびに、いちいちデータを並べ替えるプログラムを書いていたのでは大変です。多くのソフトウェアから共通に利用できる、汎用的な枠組みを作っておくと便利です。

では、汎用的な並べ替えの枠組みとは、どのようなものでしょうか。ここでは、データの並べ替えを、クラス設計の視点から考えてみます。 ................

良いシーケンス図を描くための発想法

作成:2008年6月25日

UMLの図法の中でも、シーケンス図はとても良く使われるものの1つです。クラス構成が複雑なアプリケーションでも、メソッドの呼び出しを順に辿っていき、それをシーケンス図に描いてみると、処理の流れが理解できたりします。

しかし、シーケンス図は、単に処理や手続きの順序を示すためのものではありません。メソッドが多かったり、呼び出す順序が決まっているからと言って、単に、呼び出されるメソッドを順に並べただけのシーケンス図を描いてしまうことがありますが、それはあまり意味がありません。

ここでは、良いシーケンス図を描くための考え方を紹介します。 ................

究極のインターフェース指向設計

作成:2008年6月30日

インターフェースを使うと、クラスやメソッドの再利用性が高まります。

しかし、インターフェースを使うのは、コードを再利用するためだけではありません。たとえ再利用しなくても、敢えてインターフェースを作ることもあります。むしろ、再利用するか否かに関わらず、インターフェースを使うべきだ、という考えもあります。

ここでは、インターフェースの存在意義について考えてみます。 ................

インピーダンス・ミスマッチを解決する、O/Rマッピングの設計

作成:2006年8月1日

オブジェクト指向言語であるJava言語からリレーショナル・データベースにアクセスする際には、インピーダンス・ミスマッチという問題が起こることは、よく知られている。

ここでは、オブジェクト指向言語からリレーショナル・データベースにアクセスする際に、具体的にどのような問題に遭遇するのか、分かりやすい例を使って紹介しよう。

さらに、インピーダンス・ミスマッチを解決すべく、いくつかのO/Rマッピング方法を考えてみて、その良し悪しを検討してみよう。 ................

リファクタリングにおけるC言語プログラマーの視点

作成:2006年7月2日

ソフトウェアの開発を続けていると、クラスにだんだんメンバー関数が増えていって、巨大になってしまうことがある。こういったクラスは、分かりにくく、使いづらいため、リファクタリングを行い、複数のクラスに分割することになるだろう。

だが、リファクタリングのやり方は、人によって異なる。特に、C言語のコーディングに携わってきた人がクラスを手直しすると、オブジェクト指向的には問題のあるクラスができてしまうことがある。 ................

コンストラクタは例外を投げるべきか?

作成:2006年7月2日

「プログラミングの禁じ手Web版 C++編」では、コンストラクタから例外を投げることは、プログラミングでやってはいけない「禁じ手」の1つとされています。

しかし、私はむしろ、コンストラクタは例外を投げるべきだと考えています。 ................

関数ヘッダにおける、引数のIN/OUT区分の書き方

改訂:2005年4月20日

関数ヘッダには、関数の役割や、引数の意味、作成者や最終更新日時とともに、それぞれの引数が、関数に値を渡すためのもの(IN)か、それとも、関数から値を受け取るためのもの(OUT)かを区別するための、IN/OUT区分も明記するのが一般的です。

しかし、C言語の関数と、C++言語のメソッドでは、その概念は大きく違っています。C言語と同様に、引数のIN/OUT区分を書くことは、本当に意味のあることでしょうか? ................

エラー処理とログ出力

改訂:2005年10月15日

ソフトウェアの開発において、エラー処理は、時には本来の機能よりも重要です。業務として開発するソフトウェアでは、本来の処理を行うためのコードよりも、エラー処理のコードの方が量が多くなることも良くあります。

きちんとエラー処理の仕組みを考えないと、ソフトウェアの設計や品質にも、重大な影響が及ぶかもしれません。 ................

オブジェクト指向言語における列挙型の意義

作成:2005年10月19日

C言語によるプログラミングでは、列挙型(enum型)はたいへん良く使われます。オブジェクト指向言語でも、それは変わらないようです。C言語を拡張したC++言語ではもちろん、Java言語でも、J2SE 5.0になってから列挙型が導入されたほどです。

その一方で、オブジェクト指向言語で列挙型を使う弊害も、繰り返し指摘されてきました。列挙型とswitch文を使ったソースコードは、ポリモーフィズムを使って書き直すべき典型的な悪い例として、しばしば取り上げられて来ました。

ここでは、オブジェクト指向言語における列挙型の意義を、改めて見直してみたいと思います。 ................

値渡しか、参照渡しか

作成:2004年7月20日

オブジェクト指向言語であるC++言語では、C言語とは異なり、データはクラスのインスタンスとして表現されます。クラスのインスタンスを受け渡す時に、値渡しと参照渡しのどちらを使うべきかについては、C言語の時とはまた違った注意が必要になります。 ................

ブール値を返すメンバー関数の命名規則

作成:2004年4月22日

関数の名前の付け方は人それぞれですが、使う単語が同じなら、関数の名前はほぼ同じものになると思います。例えば、サイズをセットする関数の名前を、「set」と「size」という単語を使って考えると、ほぼ全員が「SetSize」と答えるでしょう。

ところが、真か偽かのブール値を返す関数の名前は、混乱することが多いようです。 ................

ファイルダイアログの上書きの問題は何故起きたのか?

作成:2008年9月30日

Windowsで、ファイルを開いたり、ファイルに保存したりする時は、いつもおなじみのファイルダイアログを使います。このファイルダイアログは、MFCではCFileDialogというクラスとして提供されており、誰でも使うことができます。

ですが、このファイルダイアログには、不思議な動きをする問題があります。こうした問題の原因や解決策を考えるのは、ソフトウェア技術者にとって良い頭の体操になります。 ................

Copyright(C) Seiichi Yoshida ( comet@aerith.net ). All rights reserved.