Home日記コラム書評HintsLinks自己紹介
 

フィンローダのあっぱれご意見番 第139回「現実は単純ではない」

← 前のをみる | 「フィンローダのあっぱれご意見番」一覧 | 次のをみる →

コンピューターソフトの売れ行きが少し増えているというのだが、 一体どんなソフトが売れているのかと思ったら、 コンピュータウィルスの対策ソフトが好調だというのだ。 コンピュータウィルスなんて、 百害あって一利もないかと思ったら、 実はソフトウェアの売上には貢献しているようだ。

もちろん、そんな貢献を十分にぶち壊すだけの迷惑な話がいくらでもあって、 実際困ったものではあるが、 とりあえず、ウィルス検査のソフトを使っているせいか、 感染して被害が出たことがまだない。 ただ、メール等でウィルスは毎日のようにやってくる。 もう完全にウィルス慣れしたというか、感覚が麻痺した状態だが、 大量のログだとか、ゴミのメールが蓄積して、 ディスクを圧迫するとか、本来見るべきメールが見ることができなくなったとか、 ヘンな弊害は結構あったりする。

  

Norton AntiVirus というウィルス対策用のソフトがプリインストールされているpcがあった。 このソフトは、日々発生している新種のウィルスに対して、 すぐに対応したパターンデータを配布してくれるのでありがたい。 ただし、このパターンの更新権は期限付きになっていて、 期限が切れたらもう更新しないか、 あるいはパターンデータの更新権を有料で1年延長するか、選択を迫られることになる。

 

※ pc というのは実は VAIO である。

先日、この更新期間が切れる前に、 パターンの更新権を延長しますか、みたいなメッセージが表示された。 これが表示されだすと途端に使い方が分からなる人が結構いたりして、 困ったものだという話は以前書いたような気がする。 まあそれはそうとして、 いつもと同じように、延長の申し込みをすることにした。 オンラインで申し込めるというから、指定されたサイトに行ってみたら、 お使いのソフトのサポートは終了しましたよ~ん、というのである。 つまり、もう更新しないから新しいのを買えというのだ。

 

※ Norton の場合、更新可能であっても量販店で新品を買った方が安いことがある。

ソフトウェアのコストは基本的に人件費だといわれている。 その大部分が保守に費やされるという現実も、 割と感覚としてよく分かる。 あまりに古いソフトをサポートするとコストが膨大にかかってしまうのだ。 ある限界を超えたら、古いソフトのメンテナンスのためのコストを負担するよりも、 新しいものを買ってしまった方が安くつく。 ユーザーとしても、 古いソフトの保守料金が新品を買うよりも高いというのは面白くないから、 もうサポートできないから新しいのを買えということ自体は別に文句はない。

 

※ 人件費以外には、特許使用料、使用するコンテンツの著作権料などが発生することがある。

しかし、パターン更新期限を延長しろというメッセージを表示しておきながら、 実際に指示通りに購入しに行ったら「もう延長できません」 というのはいかがなものか。 しかも、延長サービスが終了してから、申し込もうとした日まで、 1週間か2週間そこらの話なのである。 もしかすると、最初に「更新しますか」メッセージが出た時に購入すれば間に合ったかもしれないし、 だとしたら面倒がった私もマヌケだったということになる。

 

※ 「いかがなものか」という表現は、 これより少し前に、北海道出身の某議員が使って、ちょっとだけ流行った。

これが何年も買ったときの状態で使うようなソフトなら仕方ないのだが、 Norton AntiVirus は、もちろんウィルス対応データは毎週更新するし、 場合によってはプログラムも更新したり、追加するというような類のソフトなのだ。 つまり、もうサポートを終了するというのなら、 何日からそれが切れるから、何日までに更新を申し込めとか、 間に合わないと新しいソフトを買うことになるぞ、 というような情報を画面に表示する程度の処理は簡単に実現できるはずなのだ。 まさかそんな技術力はウチにはありませんなんてことはあり得ないから、 もしかすると、 そのような仕組みが特許になっていて、 実装することができなかったりするのだろうか。

 

※ ここで怒っているのはユーザーインターフェースがなっていない、 という点に対してである。

で、話はさらに先に進んで、仕方ないから Norton AntiVirus 2004 というのを買ってしまった。 考えてみたら、何もわざわざNorton を買う必然性はない。 仕方なくも何ともないのだが、 買ってしまってから気付いたから仕方ない。 このように安易にソフトを買ったらどうなるかをその後痛感することになる。 早い話が、早速インストールしてみた。 全部デフォルトでOK押すだけだから簡単である。 さて、だいたい終了した所で、すぐにLive Update をしてウィルスパターンを更新しろ、というようなメッセージが出たのだ。

  

Live Update というのは、 インターネットを経由してデータを最新の状態にするためのサービスである。 先ほど、毎週データを更新すると書いたアレである。 なるほど、出荷時と今とでは、追加対応したウィルスの数も違うだろうから、 それはすぐにやった方がいい。 そこで何をどうしたかというと、 インストールしているpcからCD-ROMドライブを取り外したのである。 なぜCD-ROMドライブを外したかというと、 CD-ROMドライブがPCカード経由でつながっているからだ。 なぜPCカード経由だと外したかというと、 このpcはネットワークカードをPCカードスロットに入れないとネットワークに接続できないのだ。 つまり、 インターネットをアクセスするためにはPCカードスロットに入っているCD-ROMドライブが邪魔なのである。 余談ですが、Windows Update でインターネットにアクセス中に CD を入れろとか指示されて途方に暮れることはありませんか?

 

※ Windows Update の話はこれとは逆で、 インターネットに接続中に CD を入れることが要求されたりする。 LAN カードとCDドライブ、どちらもPCカード経由だと、同時に使えない。

で、pcカードから正しい手順通りにCD-ROMドライブを外そうとしたら、 「インストールに失敗しました。アンインストールして、最初からインストールし直してください」という表示が出てしまったのである。 なんだそりゃ。

§

  

オブジェクト指向入門みたいな話で最近必ず出てくるネタに、 継承ではなくて委譲を使いなさいとか、 もっと過激な人だと継承を使うなと言い切ったりとか、そういう話がある。 もちろん、言いたいことは分かる。 絶対使ってはいけないというのではなく、 生半可な知識で使うと害が大きすぎるから、 きっちりマスターするまでは使わない方がいい、ということなのだろう。 もっとも、使い込まないと適切な使い方は身に付かないわけで、 矛盾した話のような気がしないでもないが。

 

※ 継承でなく委譲を使えというのは乱暴な話だが、 特に初心者が、やたら継承を使ってヘンなモデルを作ってしまうのを思えば、 現実的なアドバイスかもしれない。

継承というのは、 大雑把にいって、 あるクラスの性質を他のクラスが全部引き継ぐということである。 よくある例で、猫は動物で、犬も動物で、 共通のアレをナニしてみたいな説明があるわけだが、 「動物」なんてカテゴリで本当に共通した属性だけ抜き出そうとしたら、 殆ど何も残らなくなってしまうというのが現実である。 実際、猫も犬も鳴くから「鳴く」というメソッドを作って…などという説明があるが、 だったら鳴かない動物、例えばミジンコはどうするのか、 といった奇天烈な話が出てくるわけで、 要するに、そのモデルは動物ではなくて「犬と猫が共通に持つ性質」というカテゴリを犬と猫に継承させているだけなのだ。 実際、現実のオブジェクトをモデル化しようとすると、 確かに継承という仕組みはある程度うまく行くのだが、 結構どこかでうまく行かなくなったりする。 現実世界では、何かが他の何かを全て受け継ぐというようなケースよりも、 「殆ど同じである」みたいなケースの方が多かったりするのだが、 継承は全ての性質を引き継がせようとするから、そこに歪が生じる。

---- List 1 ----

class A
{
    public void publicMethod()
    {
        // 派生クラスで使いたい処理
    }

    private void privateMethod()
    {
        // 派生クラスから直接呼ばない処理
    }
}

class B extends A
{
}

Javaっぽく書いてみたが、List 1 は典型的な例である。 この場合、 class B は class A の処理を全て引き継ぐ。 class A の中に書かれている privateMethod を class B が直接呼び出すことはないのだが、 class B が何かしたときに privateMethod が実行されることがあるだろうという意味において、 class B は private なメソッドも含めて、まぎれもなく class A をまるごと引き継いでいるのである。

ところが、現実世界のモデルを作ろうとすると、 何か突然変異みたいなことがあって、 基本的に基底クラスの性質を受け継いでいるのだが、 ある種の性質は引き継いでいないということがある。 もちろん、そのためにあるのがオーバーライドという仕組みである。 override という単語を辞書で調べてみると、「無効にする」のような訳が出てくる。 つまり、継承という仕組みで基底クラスの性質を受け継ぐと同時に、 ある種のふるまいは基底クラスを無視して行ってしまえ、 というのが override のココロだともいえる。 そういう意味では、 空の処理をオーバーライドして、元の処理を無効にしてしまうようなやり方は、 何となく例外的な感じもするのだが、 実は正統派なのかもしれない。

---- List 2 ----

class B extends A
{
    public void publicMethod() {} // 何もしない
}

---- List 2 end ----
  

ただ、このような書き方をしても、class B が publicMetod を持っていないという状態にはできないから、 やはり派生クラスは基底クラスの性質を全て受け継いでいるのだともいえる。 「鳴かない」というのも「鳴く」の一種だという解釈である。 もともと部分的に性質を引き継ぎたくなければ、 その部分だけ継承しないというのが自然な発想だと思うのだが、 Javaにはpublicなメソッドを部分的に継承しないというような高度な技はないし、 以前に紹介したように、クラスを分割、再構成することで、 受け継ぐべき性質だけ明確に引き継がせることはできる。 ただ、それは人間が考えるにはかなり面倒な話だというだけのことで、 まずそのあたりのツールを探すか作るという所から入るのがプログラマー的発想なのだと思う。

 

※ クラスの分割というのは、例えば動物クラスから鳴く動物クラスを派生させて、 そこから猫クラスや犬クラスを作るという意味である。

(C MAGAZINE 2004年2月号掲載)
内容は雑誌に掲載されたものと異なることがあります。

修正情報:
2005-05-16 注釈追加版を公開。
2006-02-28 裏ページに転載。

(C) Phinloda 2004-2006, All rights reserved.