[特別企画]
仕事や日常生活に勘違いはつきものです。
特に技術的な内容の勘違いは、自分一人ではなかなか気づかないもので、 あるとき先輩に指摘してもらったり、別件のことを詳しく調べてたりするときにふと発見することが多いでしょう。
本記事では、そのような自分一人では気づきにくい技術的な内容の勘違いを、オブジェクトの広場編集員の実体験に基づいて集めてみました。
オブジェクト指向に関係する技術的な内容の勘違いとして、大きく 「オブジェクト指向開発における勘違い」、「UML の表記における勘違い」の 2 つに分類しています。
また、番外編として「日常生活における勘違い」も集めてみました。技術的な内容に疲れたときにでもお楽しみください。
なお、取り上げた勘違いの中には、まだ勘違いしているところもあるかと思います。もし、その点をお気づきになられた方はオブジェクトの広場編集部 oosquare-editor@ogis-ri.co.jp までご連絡くださいませ。
UML の表記法を覚えてから、クラス図やユースケース図を描くことでモデリングが全て完成するような気になっていました。確かに、複雑なドメインや要求を図示化することで、情報が整理されとてもわかりやすくなります。しかし、図は概要をつかむのには良いのですが、図だけでは表しきれない情報や、テキストで書いた方が簡単にかつ正確に表せる情報もあることに、最近気がついてきました。 また、クラス図も登場する概念の整理に大いに役立ちますが、クラスの定義や重要な制約を書き忘れると思わぬ誤解を生んでしまうことがあります。図で表しきれない重要な情報はテキストで補足することも大切なんですね。実は UML の仕様にも、図の描き方だけでなく、OCL (Object Constraint Language) というテキスト形式の言語も定義されています。 図とテキストを上手に使って、これからもわかりやすく正確なモデルを作る努力を続けていきたいと思います。 参考資料
(よ)
|
UML や RUP を学び始めた頃は、要求といえばユースケースモデルやユースケース記述が重要で、パフォーマンス要求やユーザビリティなどの機能外要求はおまけぐらいの感覚でした。実際のプロジェクトではユースケースと同じくらいかそれ以上に機能外要求は重要だ、ということを少ししてから気づきました。 なぜ誤解に陥ったかというと、ユースケースを重視し、機能外要求を軽視している UML と RUP だけを基準にしてソフトウェア開発を行ったからです。 では、機能外要求をちゃんと定義すると何がうれしいのでしょうか。 機能外要求を識別するフレームワークとしては、FURPS や ISO9126 の品質特性がありますが、私は ISO9126 を好んで使っています。ISO9126 の方が機能外要求を詳細に分類しており、また抜け漏れがないからです。 FURPS
ISO9126 の品質特性 利用時の品質
外部品質/内部品質
参考資料
(ちー2)
|
ある企業で販売店と顧客、従業員の情報を管理したいとします。同一人物がある販売店の従業員であったり、複数の販売店の顧客である場合を想定します。まずはこんなクラス図が描けました。 ところで、モデリングに慣れてくると、「顧客も従業員も人の役割に過ぎないよなぁ。どちらも同じ属性を持っているし。」と考えて、以下のようなクラス図を描きたくなったりしませんか? 実際、同一人物なら、名前も住所も電話番号も同じはずですよね。とてもすっきりしたモデルになりました。
ところがところが、実際の開発でこのモデルを使おうとするとうまくいかないんですね。顧客情報の登録依頼、変更依頼は各販売店が受付けて管理します。上のモデルではどこか1つの販売店で例えば住所の変更を行うと、顧客や他の販売店の知らないところで、他の販売店の顧客情報も書き換わってしまいます。顧客との間に情報の一括管理を行うという契約があるなら問題ありませんが、個人情報の管理に厳しくなってきた昨今では充分注意する必要がありそうです。 モデリングでは、単に現実世界を忠実に再現するだけではなく、その情報を認識し必要としている人の視点も考慮しないといけません。いや、「われ思う、ゆえにわれあり」とデカルトが言うように、本当は現実世界の私も認識している私がいるからこそ存在するのかもしれませんね。
(よ)
|
システムそのものの状態をモデリングしたいと思うことはありませんか。例えばシステムの運用に関係した状態(開局中、閉局中など)やその遷移が複雑な場合には、これを整理するためにモデリングする必要があります。このような場合には、システムの最上位のパッケージ(例えば、jp::co::ogis_ri::xxxsystem パッケージ)に状態を定義しステートチャート図を作成していました。しかし、これは UML の仕様からすると誤った使い方で、正しくはパッケージの下位概念であるサブシステムを使うことが正しいようです。 UML の仕様では、分類子( Classifier :クラスやコンポーネントの上位概念)と振る舞い特性( BehavioralFeature : 操作やメソッドの上位概念)にしか 状態機械( StateMachine :状態や状態遷移を定義する概念)を定義できないことになっています。パッケージ( Package )は分類子でも振る舞い特性でもないため、状態機械を定義できません。 サブシステム( Subsystem )は分類子の下位概念でもあるため、ありがたいことに状態機械を定義できます。 そもそも、パッケージとは UML のモデル要素をグルーピングする仕組みであり、状態を定義するための仕組みではありません。 みなさんも、システムそのものについてモデリングしたい場合は(状態に限らず!)、サブシステムを使ってはいかがでしょうか。 ただし、UML 2.0 では、サブシステムがコンポーネントのステレオタイプの一つとして扱われるようなので、いずれ UML 2.0 が普及したあかつきにはコンポーネントをメインに使うようになるでしょう。 参考資料
(ちー2)
|
オブジェクト指向について習い始めたとき、クラスとインスタンス、オブジェクトという3つの言葉の使い方に翻弄されたことを覚えています。 原因は教科書によって、インスタンスのことをオブジェクトと書いていたり、クラスのことをオブジェクトと書いていたりすることがあったからです。どちらかというと、インスタンスとオブジェクトが同義語として説明している教科書が私が読んだ書物の中では多数を占めていたため、 オブジェクト = インスタンス という関係が正しい関係だと思っていました。実際は、オブジェクト指向ではクラスとインスタンスを含めてオブジェクトというのが正解らしいです。 ただし、インスタンスのことをオブジェクトと言ってもだいたいの相手には伝わるので「オブジェクトはインスタンスである」としていいのでしょう。 参考URL
(トミー)
|
UML のインターフェースは 操作 を持つだけであり、属性 は持てません。
UML から Java コードへ単純にマッピングをしている限りは気付かない、小さな違いです。 ちなみに、修飾子を付けなくても、暗黙的に public static final となります。
参考資料
(さよこ)
|
UML と Java の可視性は、以下のように一対一の対応関係にあるものと思い込んでいました。
既に Java の可視性を知っていた私は、UML でも同様の概念がある、と聞いた時点で「ああ、Java と同じなんだな。」と勝手に決め付けてしまって、それ以上先の説明を真剣に聞かなかったのです。 それから月日が経過すること 3 年。つい最近になって先輩から、protected に関しては スコープが異なることを教えて頂きました。 Java の場合、「自分とそのサブクラス、および同一パッケージからアクセス可能」と定義されていますが、UML では、「自分とそのサブクラスからのみアクセス可能」だったのです。幸い、これまでのところ、この勘違いで災いを招いたことはありませんでしたが、新しいことを学ぶ時には真摯に取り組まねばならないな、と改めて思いしらされました。
(ビタミン C++)
|
ユースケースの拡張関係と汎化関係の使い分けについて悩んだことはありませんか? 私は、ユースケースの拡張関係(extend)はユースケースの汎化と置き換えて使えるものだと思っていました。 実際には、両者には違った意味があります。これから、両者の違いを見ていきます。
まずは、拡張関係について説明します。
オブジェクトの広場の記事の作成を支援するシステムをイメージして、図 1 を参照してください。
オブジェクトの広場で記事を書く人は、記事をテキストで書いてから HTML 化を行い、レビューと修正を繰り返します。
記事の作成を支援するシステムとなると、簡単なタグと本文を打ち込むことでテキストを HTML に変換してくれるツールや、スペルチェックなどを行ってくれるツールなどが考えられます。 このように、拡張関係は振る舞いを「拡張」するために使われます。 拡張関係は乱用するとユースケース図がわかりにくくなります。 参考文献[1]では次の二つの場合以外では拡張関係を使用しないことを推奨しています。 一つは、既に確定されて変更できない場合。 もう一つは、基底ユースケースを中断してユーザーが利用するサービスがたくさんある場合(「記事のスペルチェックを行う」というようなユースケースが複数考えられる場合)です。 図 1 拡張の例 次に汎化関係です。 拡張関係に対し、汎化関係は特定の形式や技術などに特化されたユースケースが複数存在する場合に使われます。 図 2 では、「目的地に移動する」するという目的に対して「車」「自転車」というバリエーションがあることを示しています。 図 2 汎化の例 ここまで、拡張と汎化の違いを見てきましたが、拡張関係は振る舞いを拡張したい場合、汎化関係はユースケースのバリエーションを表現したい場合に使用することがわかりました。 さて、なぜこのような勘違いをしたのでしょうか。 両者は明らかに違うシーンで使われているので、なぜ勘違いしたのか首をかしげる方も多いと思います。 すでにお気づきの方もいるかもしれませんが、Java の extends を連想して拡張関係(extend)を継承と考えてしまったというわけです。 参考資料
(あかさた)
|
クラス名は違えど、図 1 や 図 2 のようなクラスを今までに描いたことはありませんか?
厳密に言えば、この説明には誤りがあります。誤りの部分は、1 の「 ≪interface≫というステレオタイプを付けている」のところです。なぜなら、UML の仕様書 [1] に即すると、≪interface≫ は、ステレオタイプではなく、「キーワード」と呼ばれるからです。 UML を学びはじめた方は、≪ ≫ (ギュメと呼ばれる) を使って表記できるものは、すべてステレオタイプであると思っている方がほとんどでしょう。私自身もそうでした。しかし、UML の仕様書では、ギュメは、ステレオタイプとキーワードを表すのに使用されるようです。 では、キーワードとステレオタイプの違いは何でしょうか? ・・・すいません。私自身はその違いを正確に説明することができません。というのは、次のような理由があるからです。
ただ、キーワードとステレオタイプの本質的な違いがわからないからといって、キーワードとステレオタイプを区別するための方法がないわけではありません。UML の仕様書の付録 A に掲載されている UML 標準要素(UML Standard Elements) を利用すれば区別することは可能です。これは、UML 標準要素に掲載されているものをステレオタイプとし、掲載されていないものをキーワードとして区別する方法 です。この方法で判断すると、UML 仕様書内においては(私が確認した範囲では)矛盾が発生していないので、UML の仕様書に沿って適切に区別することができるでしょう。 ≪interface≫ 以外のキーワードとしては、何があるのでしょうか? 以下に挙げてみました。キーワードという概念を私自身が知る前は、 これらすべてをステレオタイプと呼んでいました。
さて、私自身が何故このような勘違いをしていたかの原因を考えると、私が参照していた多くの UML の書籍に、ステレオタイプの説明として≪interface≫ が取り上げられていたことが大きいと思います。近くにある UML の書籍を手に取って、索引から ≪interface≫ か、ステレオタイプかのどちらかを調べてみてください。おそらく、ステレオタイプの説明として、≪interface≫ が取り上げられていることでしょう。 もちろん UML の書籍の中には、キーワードとスレテオタイプとを区別している書籍がないわけではありません。私が把握している範囲では、以下の書籍は区別しています。
しかし、これらの書籍の中でも微妙にキーワードとステレオタイプに該当するものが異なっているので、最終的には UML 仕様書 [1]を確認した方がよいですね。 ちなみに、私は、≪interface≫ はキーワードと呼ぶべきだと思っているわけではなく、今後もステレオタイプと呼んだ方が良いと思っています。キーワードとステレオタイプの違いを知っても利用者がモデ リングする分には影響しないからです。また、使い分けると混乱のも とにもなりかねません。ただ、UML の仕様書に則して解説するときは、 キーワードとステレオタイプは使い分けてほしいとは思っています。 参考資料
( 3 日前坊主)
|
図 1 と 図 2 は、それぞれ状態図の状態 (State)、アクティビティ図のアクション状態 (Action State) を表していますが、それぞれ表記が違うことを知ってましたか?
私は、状態とアクション状態はどのダイアグラムに描くかの違いだけで、両方とも同じ「丸み付き四角形」で表記するものだと思っていました。
UML モデリングツールによっては、状態とアクション状態を同じ形で書けたりするので、それが混乱のもとになっているのかもしれませんね。 参考資料
(おもなが)
|
みなさんは、アクティビティ図を記述する際にオブジェクトフローを定義したことはありませんか。オブジェクトフローとはアクション状態やサブアクティビティ状態のインプットやアウトプットとなるオブジェクトやその状態を定義するモデル要素です。私がこのモデル要素を知った当初は、オブジェクトという名がついているために、オブジェクト名と下線を記述する必要があると思っていました。実際に、一部のモデリングツールではオブジェクト名を記述できるようになっています。しかし、これは勘違いでした。 UML のノーテーションガイドでは、オブジェクトフローにはクラス名と状態名だけを記述するように示してあります。また、UML のメタモデルでは、オブジェクトフローは分類子( Classifer :クラスやコンポーネントの上位概念 )としか関連づいていませんでした。 ちなみに、UML 1.5 では破線矢印と四角形の名称が明確になっていませんでしたが、UML 2.0 ではそこが明確になっています。 参考資料
(ちー2)
|
C 言語のプリプロセッサや、Perl のコメントを記述するときなどに使う "#" 記号ですが、私は最近まで、これを音楽記号の♯(シャープ)だと思っていました。よく見れば、線の角度が違います。
"#" 記号は、番号記号(number sign)といって、通常は、数字を示すために使われます。日本でよく使う、"No." と同じ意味ですね。
ちなみに、プッシュホンのボタンに印字してあるのは番号記号なので、「シャープ」と読むのは間違いということになります。
( T2 )
|
最近TVCMなどで一気に有名になった感のあるブログ。 ブログを見ていると、一日分の日記の下に「トラックバックURL」が記述されているものがあります。 私は最初、特定の日の日記にリンクするためのURLだと思っていたのですが(ブログは日々更新されトップページがよくいれかわるため)、 それは勘違いでした。実際にはいわば「逆リンク」のようなものでした。 つまり、ブログAで書かれたトラックバックURLを別のブログBで記述することで、Aに対して強制的にBへのリンクを張らせることができるのです。 正確には、
となります。 B側としては「あなたの書いた記事についてここでコメントしていますよ。」とブログA側にお知らせでき、ブログA側としては他のどのブログがこの日記を参照しているかわかることになります。 勿論、お互いのブログサービスがこの機構をサポートしていなければならないのですが、リンク「させる」というのが新しいと思いました。 参考URL
(おつ)
|
実際に特許関連の業務(申請、審査、審判など)を行っているのは、特許庁で東京特許許可局ではありません。そもそも東京特許許可局なんていう局は存在しません。 特許庁では、特許を“許可”するという表現は使っていないので、東京特許許可局という言葉は、早口言葉のためにできた言葉のようです。 ちなみに特許庁のホームページ https://www.jpo.go.jp/ はなぜか英語です。
( T )
|
『イケメン』というなんとも奇妙な言葉がテレビでも聞かれるようになって久しいですが、この言葉、私はてっきりうまいラーメン屋や讃岐うどんブームに乗っかって生まれた言葉、すなわち『イケ麺』 → 『イケてる麺』 → 『おいしい麺』を指す言葉だと思っていました。 なので、テレビなんかで「この人はイケメンだ」みたいに人に対して使っているのを聞くと、「ふ〜ん、この人の作る麺はそんなにうまいのかぁ」なんて思っていました。しかしこれはとんだ勘違いだったようです。 実際は、顔立ちの良い人に対して言う言葉で、『イケ面』 → 『イケてる面』 → 『かっこ良い顔』という意味だそうです。なお、主に男性に対して『かっこ良い』という意味で使うことから『イケmen』 → 『イケてる男性』 → 『かっこ良い男性』という意味もあるそうです。 ただし、『イケメン』という言葉が『かっこ良い男性』という意味であると、広辞苑に書かれているわけではありません(新語辞典には書かれていたりしますが・・・)。なので今のところは『イケメン』をどのように解釈し、どのように使おうが個人の自由だというわけです。 『イケメン』という言葉が妙に引っかかる、もしくは神経を逆撫でするという方(少なくとも私はそうなんですが)、『イケメン』はおいしい麺に巡り合った時に使うことにしませんか?
( T )
|
『気のおけない仲』とは、余計な気を置かなくても良いという意味で、「遠慮しなくてもいい間柄。気遣いしなくてもいい間柄」を表す言葉だそうです。逆に『気のおける仲』とは、気を置かなくてはならないという意味で、「遠慮する間柄。気使いする間柄」を表す言葉だそうです。 私は、『気のおけない仲』を、「ある程度、気持ちを抑えて付き合わなければならない間柄」だと勘違いし、『気のおける仲』を、「素直に気持ちを出せる間柄」だと勘違いしていました。 ややもするとまったく正反対の意味で使ってしまうこのような言葉は、日本語には意外と多いものです。言葉の意味を正確に理解して使うようにしたいですね。
( T )
|
© 2004 OGIS-RI Co., Ltd. |
|