読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

AspectSharpのチュートリアルが面白すぎる件

AOPをちょっとやってみたいと思って、ライブラリを巡ってたら一番アクティブに更新されてそうなAspectSharpをみてみたら、Tutorialが面白い。ので、頑張って訳してみる。


An hypothetical situation - not so much

To make things more interesting, lets suppose you're working on a specific application. You're creating a revolutionary Content Management System, and you probably end up with a big although nice and simple object model. The most important components implement IContentProvider and IView. IContentProvider is obviously responsible for gathering content from some source like database, Xml, RSS, Excel files and IView is responsible for displaying it in a specific way for a specific channel.

Everything is fine and your almost done with your four thousand ContentProviders and Views that cover all existing communications channels available in the world today. Suddenly, the sales guy - always blame the sales guy - comes, with from his standpoint, an non-important requirement. He needs security checking for providers and views, and he already sold it as done for an important customer, lets say the BBC. Your company's future depends on having it completed by the end of the day!

訳:
話をちょっとばかり面白くするために、これからの作業をどこか特定のアプリケーションに仮定してみよう。君は革命的なCMSを作ってて、もう作業は終了目前だ。巨大だが、素敵でシンプルなオブジェクトモデルもできあがった。最も重要なコンポーネントはIContentProviderとIViewの実装を持っている。IContentProviderはいろいろなソースからデータを集めてくる役目をもつ。データベースやXMLRSSやエクセルなんかだろうね。そしてIViewは特定のチャンネルに特定の見せ方でもってデータを表示するわけだ。

すべては上々だ。君はこの世に存在する全てのチャンネルをカバーする4000のContentProviderとViewの実装をほとんど完了しているからね。 だが突然、営業が、-文句をつけてくるのはいつもこいつらだ- やってきて、奴自信の勝手な考えから、特に重要でもない要求を突きつけてきた。奴はContentProviderとViewにセキュリティチェックが必要らしく、なんと奴は重要な顧客、たとえばBBCとしよう、にその要求をやったものとして売ってきたらしい。君の会社の未来はその日の最後までにそいつを片付けることに、懸かっている。

The available solutions

You need to expose your objects as a securable resource for your security framework. To ease the burden of having to change every single ContentProvider and View you think about a few possibilities:

  • Create a property on IContentProvider and on IView exposing the IResource information.
  • Create an 'IResourceable' and making IContentProvider and IView extend from it.. Then modify its base classes, although you're not sure whether such a base class exists.
  • You're on the ninth floor, so jumping out the window could solve things for a while...

The problem with these possibilities is that they all will bungle your nice and clean object model. In your conception security doesn't have anything to do with content providers and views, but for some of them it makes sense. So, for those that make sense you'd like to introduce the ISecurityResource interface and implementation.
Well, c'mon! You only have a few hours, start to modify those components now! Not so fast, let's use AOP for it.

君が作ったオブジェクトを、君のセキュアなフレームワークのために安全なリソースとして公開しないとね。全てのContentProviderとViewを変更する作業を簡単にするためには、幾つか可能性がある。

  • IContentProviderとIViewにIResourceの情報を公開できるプロパティを追加する
  • IResourceableリソースを作って、IContentProviderとIViewをそいつから派生させる。それからベースクラスを書き換えていこう。どんなベースクラスがあるのか君は確かには知らないけどね・・・
  • 君は9階にいる。だから窓の外へジャンプするのは、しばらくの間問題を解決するかもしれないね。

これらの方法の問題点は、君の作った素敵でクリーンなオブジェクトモデルを台無しにしてしまうことだ。君のセキュリティ設計にはContentProviderやViewとはほとんどなんの関係もないんだけど、いくつかは関わっちゃってる。だから、そいつらのためだけに、君はISecurityResourceを実装してやりたいんだ。
よし、やろう。君にはもう数時間しかない。関係あるコンポーネントを変更しよう。そんなに急かないで。AOPを使おう。