yotiky Tech Blog

とあるエンジニアの備忘録

オブジェクト指向とVirtual Reality

オブジェクト指向の説明で「現実のモノを表現する」とそれに対するコメントを見て考えにふけったメモ書き。

バーチャルリアリティとは?

日本バーチャルリアリティ学会によると、

 バーチャルリアリティのバーチャルが仮想とか虚構あるいは擬似と訳されているようであるが,これらは明らかに誤りである.バーチャル (virtual) とは,The American Heritage Dictionary によれば,「Existing in essence or effect though not in actual fact or form」と定義されている.つまり,「みかけや形は原物そのものではないが,本質的あるいは効果としては現実であり原物であること」であり,これはそのままバーチャルリアリティの定義を与える.

現実のものと表面的に似ているかどうかではなく、本質的、効果的に人がものとして捉えられるかってこと。

写実的な絵画ではなく抽象絵画。一見それに見えない。だが本質を捉えて表現されているため、それは紛れもなくそれである。

オブジェクト指向」は「Virtual Object」=「実質的なモノ」なんじゃなかろうか。 人がその"モノ"を"モノ"として捉えるエッセンスを持たせる、持つように組み立てて表現すること。

オブジェクトの「名前」によって"モノ"を決定し、「属性」と「振る舞い」で"モノ"を捉えるための実質的なエッセンスを定義する。

上手く表現できないと鑑賞する人に伝わらないし、そのオブジェクトに対する没入感を得られない。

Reduxの概要

Unityのアプリケーションのアーキテクチャを考えるのに、参考になるかと思ってJavaScript界隈の最近の流行を調べて見たので覚書。
JavaScriptiOS界隈もそんなに詳しくないので、入門記事やそのサンプルなど眺めながら理解した内容です。

目次

TL;DR

ReduxはJavaScriptアプリのための、状態を管理するためのフレームワーク
View、表示に関する責務はそれに特化したフレームワークに委ね、組み合わせて利用する事が多い。代表的なのはReact。

Redux + α

iOS ReSwiftを元にReduxを読み解く

一番解りやすかったのがiOS向けにReduxを説明した記事だったのでこのような形に。1 斜体はReSwift特有の事項。

  • State
    • Data, POCO
    • Root(e.g. AppState)を起点としたツリー構造
    • Reducerに渡すものはStateTypeを継承してマーキング
  • Action
    • 処理種別と入力パラメータを持つData, POCO
    • 処理手続きのための申請書みたいなイメージ
    • Actionを継承してマーキング
    • 「具体的にどう変化させるか」という結果ではなく、UseCase(何を指示するか)で定義する
  • Reducer
    • Actionを受理しStateを更新する
    • StateとReducerは対になる(つまりツリー、reducer composition)
    • ActionはすべてのReducerにBroadcastされる(伝搬)
    • 各Reducerは自身で判断し、対のStateを変更する
    • (state, action) => state を満たす副作用のない純粋関数
      • 引数の値を変更しない
      • API呼んだり、ページ遷移などダメ
      • 毎回結果の変わるものを使わない(現在日時とか乱数とか)
    • Root(e.g. appReduce)を起点に下位のReducerにブロードキャスト
  • Store
    • シングルトン
    • データを保持する(「State+Reducer」のツリー)
    • Dispatchメソッドを提供する
    • 状態の変更通知するため、リスナー(View)を登録するメソッドを提供する
      • Dispatchの結果、登録されたリスナーに通知される
      • この時Storeから現在のStateを取得することもできる
  • Dispatch
    • Actionを引数にStoreに手続きを依頼する窓口
  • ActionCreator
    • Actionを構築し生成するだけ

Reduxの処理の関連図。 f:id:yotiky:20181018225458p:plain

個人的なイメージはこんな感じ。
f:id:yotiky:20181018225444p:plain

React

  • Viewを表示することに特化したライブラリ
  • 仮想DOM(Virtual DOM)
    • 生のDOM(HTMLのインスタンス)ではなく、対となるツリーな構造体
    • StateAとStateBのHTML的なdiffを取り差分を埋めるpatchを生成し、patchを適用することで状態を遷移させる(表示を変化させる)
    • 生のDOMを操作する文化から脱却

Redux(JS) 上級

  • Middleware
    • ActionやReducerで必要になりそうな副作用のある処理や非同期処理はここに押し込める

イメージはこんな感じになるのかな。
f:id:yotiky:20181018225432p:plain

まとめ

サーバーサイドはViewとそれ以外のModelって発想でModelを小さく表現してその実巨大なわけだけど、フロントサイドもMiddlewareと言うロジックを書く領域小さく表現してるが結構身が詰まってそうだなぁと。

HTMLはRootがあってそこからTreeがあるってのが大前提にあり、ReduxもReactもそれを踏まえた上での仕組みですね。
UIデザインの構成もコンポーネント志向により親子構造を構築する流れもありそうだし、全体通して方向性が一致してていいのではと思う。

一方UnityはHierarchyがツリー構造ではあるものの、全然枝葉の違う所同士で割と縦横無尽に関係を築きたがるし、相互に関連するものも多いので、Tree縛りでUI、状態を構成するとなると相当に大変かなと思う。Unityそのものを喰らうぐらいの思想とパワーがないと厳しかろうて。
部分的に親子構造を持ちつつ親が子を操作するのではなく、伝播させるって仕組みくらいは参考になりそうなならなそうな、使い所は考えたい。

参考

IoCとService LocatorとDIの関係

目次

概要

連載的に書き始めたアーキテクチャのお話で、IoC、DIという単語が出てきたので軽くまとめておく。

制御の反転と実現

登場人物はIoC、Service Locator、DI。すべてパターンと呼ばれるものの一種。

IoC」は「Inversion of Control」の略で、日本語だと「制御の反転」。
インターフェイスを間に挟み仲介することで、具象クラスが何になるかは外部で決めるようにするというパターン。
これ自体は汎用的な名前で定義されており、続く「Service Locator」、「DI」がそれを実現するためのパターンとして定義される。

f:id:yotiky:20180928053641p:plain

「Service Locator」は、SingletonなFactoryに、生成したインスタンスをキャッシュする機能を備えたようなもの。
事前にService Locatorに使う具象クラスを定義し、使う人がService Locatorに問い合わせると良しなにインスタンスを返してくれる。それが何の具象クラスかは知らない。

f:id:yotiky:20180928053648p:plain

「DI」は、「Dependency Injection」の略で、日本語だと「依存性の注入」。
呼び出す側が使う人に具象クラスを渡してあげるパターン。使う人はインターフェイスで受け取るので、それが何の具象クラスかは知らない。

f:id:yotiky:20180928053656p:plain

Injection(注入する方法)はいくつかあって、コンストラクタ、セッター(プロパティ)、フィールド、メソッドなど。インターフェイスってのもあるらしい。

「DI」自体はフレームワークがなくても実装可能ではある。
しかし「DI」には、「DI コンテナ」が多く存在する。「DI パターン」を実現するために有効なフレームワークだ。
「DI コンテナ」により、先の多様なInjectionに対応したり、Injectionの処理自体を裏で引き受けてくれたり、インスタンスのライフサイクルを管理したりと手厚いサポート受けられるようになる。前述のInjectionに対しては、属性をマーキングすることで実現する方法も手にれられる。

f:id:yotiky:20180928055240p:plain

「DI」自体は、外から注入するというだけのパターンであるが、「DI コンテナ」は「Service Locator」の役割も包含してしまっているように思える。
そりゃみんな「Service Locator」は置き去りにするわけだ。
ついでに、機能的に多くを必要としないからか「Service Locator コンテナ」は見かけたことがない。「IoC コンテナ」と言ったときは間違いなく「DI コンテナ」のことだろう。

Injectionは、コンストラクタが推奨されているようだ。インスタンスが生成された時には、必要な初期化が終わってるべきだというわけ。
ただし、Unityに限っては多くの生成処理がUnity側にあるので、コンストラクタが使えない。そのため次点でメソッドとなるらしい。

「Service Locator」と「DI」の使い分けについては、2004年と古いがMartin Fowlerの考察が載っていて興味深い。1

参考にさせて頂いたサイト

Unityを取り巻くアーキテクチャ 第2部 「DDDのアーキテクチャ」

アーキテクチャは読み手の解釈に委ねられる部分が多かったり、提唱されたあとも進化や変化があったりするので、あくまで現時点でそれぞれどう捉えてるかの覚書と考察を。雑ならくがき、雑がき。

※編集したり更新したりする予定です。

目次

概要

つらつらと書き始めたら思いの外風呂敷が広がってしまったので、「MVxとLayerd Circleについて」、「DDDについて」、「Unityで実装する話」の3部構成くらいに収まるといいなぁと言った所です。
今回の記事は第2部「DDDについて」にあたります。 第1部を読まれていない方は、全体における導入部分もありますのでそちらも読んで頂けると嬉しいです。

DDD

「DDD」は、「Domain Driven Design」。「X Driven "Development"」ではないので注意してほしい。開発プロセスではなく、ドメインを中心に"設計を成熟させる"ための思想、パターン、HowTo。言い換えると「どのように駆動していくと設計が成熟するか」の方法論。アーキテクチャの構成、つまり『アプリケーションの静的側面を図式化して説明する』だけの話ではない。

「DDD」は、2003年にEric Evansが『Domain-driven design』という書籍で提唱した。その後、2013年にVaughn Vernonが『Implementing Domain-Driven Design』という書籍で「DDD」を解説している。前者を「DDD」や「原典」、後者を「IDDD」などと呼ぶ。
アーキテクチャについては、この2つは異なるアーキテクチャを持ち出しているらしい。ここからは原典のお話し。

Domain

ドメイン」とはなんぞや、これがとても分かりづらく厄介。
アプリケーションが対象とする業務領域、業務の関心事なんて言われるが、それって一体何って話。

一部の業務アプリケーションを例に取ると少し想像しやすいと思う。会計なら"会計"を成す一連の処理。
"どこから入力"されようが、入力されたものが正しければ会計処理自体には影響がない。また、データが"どこから取得"できて、"どこに保存"されるのかも、会計処理自体には影響がない。さらに、会計処理を"ソフトウェアとして具現化"するために必要な処理もまた会計処理自体とは切り離される。

ソフトウェアであろうがなかろうが、とにかく正しくインプットされ、必要なデータが取れたり、保存されたりされていれば会計処理自体は論理的に動く、つまりそこが「ドメイン」。

この切り口で行くとゲームも同じように、インプットを分離し、データへのアクセスを分離し、スマホだろうが、紙のボードだろうが、机上だろうが、動くロジカルな部分が「ドメイン」となる。インゲーム/アウトゲームなんて分け方もあるが、どちらも関心事には違いないし、アウトゲームを動かさないとインゲームが動かない事もあるのでどちらも「ドメイン」。ログは「ドメイン」から外れるだろうし、認証はゲームを動かす根底には関係ないものの必要な要素、ということで「サブドメイン」なんてロールも用意されてるらしい。

ドメインを駆動する基盤

で、この「ドメイン」にはエキスパートがいる。いなかったりもするが。
特に業務系で、先に上げた会計や金融などは業務への深い知識が必須となる。
(...ゲームを「ドメイン」として設計してる人はいるんだろうか。)

過去に会計パッケージのプロジェクトに携わった事があるが、50代、60代のおじちゃまがExcel方眼紙に「もしXXがOOだったら」といった日本語プログラミングを書いて、若い人がコードに起こすなんてことを経験したこともあり、一朝一夕で「業務領域」を理解するのは難しいなと思わせることもあった。

DDDでは、このエキスパートと、ユーザー、プログラマ、設計、ソースコードに至るまで、アプリケーションを取り巻く環境において「モデル」を共通言語として透過的に「ドメイン」が扱われる。つまりドメインをモデルで表現する。
エキスパートが話す「ドメインモデル」は、ソースコードレベルで同じ表現として実装される。人および設計、さらにコード間で透過的に同じ意味として扱われることで、相互に関係、関心を維持し、設計を成熟の道へ駆動するための礎となる。

「モデル」を共通言語として扱うには、"関心事をモノとして捉え、人に分かりやすいモノとして設計する"オブジェクト指向設計が馴染むのはよく分かる。人同士がイメージして捉えづらいものを共通言語として使用するのは無理がある。

ここまでが導入にあたって、で導入が済んだら漸くアーキテクチャの話。

モデル構成要素(アーキテクチャ

DDDとは別軸に、「モデル」を元に開発を進める技法 MDD(Model Driven Development)というものが存在する。オブジェクト指向UML界隈で、モデリングを中心に据えた開発手法となる。(モデリングを極めるとコードへと自動変換されるという崇高な手法を手に入れられるらしいが。。)

ドメイン駆動は「ドメイン」をすべての中心に置く壮大な思想である。故に実現するための手段すべてがオリジナルで準備されているわけではなく、一段階噛み砕いた先で使えるツールを必要とする。ここで先程のMDD(のうち主に設計手法)をツールとして利用する。前の項でも書いたようにMDDの「モデル」や元となるオブジェクト指向がよく馴染むのだろう。

ドメインを駆動するには、モデルを駆動させるのである。

さて、DDDのアーキテクチャの話に戻る。

世界の中心であるドメイン層を他から分離すると、UI層、アプリケーション層、ドメイン層、インフラ層となる。左から右へ依存関係を持つ。これ自体は単なるレイヤードアーキテクチャだ。
アプリケーション層は、ソフトウェアとして具現化するために必要な処理を受け持つ。UseCaseやFacade的なやつだ。

f:id:yotiky:20181030034913p:plain

ドメイン層に含まれるドメインモデルは「エンティティ」、「値オブジェクト」、「サービス」に分類される。更にこれらを束ねる「モジュール」(パッケージや名前空間)の4つが重要な構成要素となる。
ドメインモデルのオブジェクトはライフサイクルを管理するため、「ファクトリ」や「リポジトリ」が登場する。これらはドメインとして重要な意味は持たないが必要になるであろう機能ということでドメイン層に持つ。
インフラ層は技術的な関心事を集約する。例えばドメイン層に持つ「リポジトリ」はInterfaceのみを持ち、その中身がどこで永続化されようと同じように操作することができるようにし、永続化するための実処理は特定技術(DBなど)に依存するためインフラ層で担当する。
DBを始め、FileI/Oやその他ストレージ、O/Rマッパー、DIコンテナ、メッセージング、Webサービスなどがある。また、UI周りでもレンダリング機能、Toolkit、ウィジェットなんて記述もありこのあたりは具体的なイメージがあまりついていない。

このあたりはレイヤードアーキテクチャを構成、繋ぎ合わせるために必要となるであろう基本要素であり骨子である。これをベースに「モデル」のリファクタリングを重ねて、Deep Modelへと誘う。
が、この先になってくると継続的に改善して成熟させる話になるのでここまでとする。

IDDDに思いを馳せる

一方で、IDDDにおいては Hexagonal Architecture とそれに関係のありそうないくつかの方針を持ち出しているよう。
Hexagonal Architecture 自体は前回の記事にまとめているのでそちらを参照されたし。
DDD自体はアーキテクチャに依存しない方法論としてレイヤードアーキテクチャを例に提唱されはしたものの、「ドメイン」を隔離するにはそれじゃ足りないんじゃねってとこだろうか。

Layered Circleを持ち出すとどうしてもDIに依存せざるを得ない。した方が楽だし、都合がいい。
DDDとDIの関係については、参考サイトより以下の記述が載っていた。1
2008年と古い記事ではあるが、Eric Evansの解釈が含まれる貴重な内容だ。

DDDのフィロソフィとそれを実現するさせることを助ける技術的なツールボックスOOP、DI、そしておそらくAOP)との線引きを明確にすることが重要だ

と強調した上で、

最近になってDIはとても広く行われるテクニックとなり、それを上手く行えばDDD実践者がデザインを改善する手助けになっています。私からみて一番重要なのは、DIがドメインの分離において役立つということです。

としている。DIばんざい!

Clean Architectureの外周にあるFrameworksに、Application基盤となるDIコンテナは含めないのが頭痛を和らげる解釈になるのかな。

参考にさせて頂いたサイト

Unityを取り巻くアーキテクチャ 第1部 「MVxとLayered Circle」

最近Unityをゆるく触ってる感じで、"やりたいことをやれるやり方で"実装すると「こりゃ死ぬな..」と思ったので、界隈の設計方針調べてるところです。

アーキテクチャは読み手の解釈に委ねられる部分が多かったり、提唱されたあとも進化や変化があったりするので、あくまで現時点でそれぞれどう捉えてるかの覚書と考察を。雑ならくがき、雑がき。

※編集したり更新したりする予定です。

目次

概要

つらつらと書き始めたら思いの外風呂敷が広がってしまったので、「MVxとLayerd Circleについて」、「DDDについて」、「Unityで実装する話」の3部構成くらいに収まるといいなぁと言った所です。
今回の記事は第一部「MVxとLayerd Circleについて」にあたります。

一応自分のアーキテクチャ絡みそうな経験を軽く記す。 大体C#使って開発してて歴はそこそこ長め、古くはクラサバや3層アーキテクチャWPFでMVVMのまさかり飛んでる頃にはWPFのプロジェクト携わったり、ゲームのサーバーサイドをASP.NET MVCでやったりなどなどしてました。

アーキテクチャ

アーキテクチャは、アプリケーションをどう動かすか、どう設計するかのパターン。
アーキテクチャは、性質上読み手の解釈が異なることも多く、定義自体の”解釈の議論”が発生してとても不毛だとは思う。
より明確であったなら、使えるか使えないか、どう使うかの判断だけで済むのだが、プロジェクトの状況によってコンテキストも違うので全部ケースバイなんて無理だし難しいよねと。テクノロジーや時間経過によっても変化や進化はあるし。

ただアーキテクチャは経験則によるパターンなので、「何に対してどう対処したのか」を自分なりに理解し、使える武器として揃えておくことは有用だ思う。使える時に使えばいいし、合わなければ使わなければよい。

名前をつけて提唱された"アーキテクチャ"は、アプリケーションに骨子を与える。登場する箱は主なキーパーソンでしかない。それ以外に定義しちゃダメってわけでもないし、箱すら分離して崩したっていい。そもそも着眼点以外がふわっと定義されてたりもするし、プロジェクトに合わせて柔軟に対応すればいい。
最終的には我々がやってることは学問じゃないので、アーキテクチャが正解かどうかではなく、目の前の問題に対処できたかどうかの方が大事だ。
ひとつ注意するとすれば、アーキテクチャの目的、意味は理解しておきたい。アーキテクチャの目的を理解していないと、名のある"アーキテクチャ"が"アーキテクチャ"として意味をなさなくなるし、箱の名前と役割も変わってくる。

「MVx」と「Layered Circle」

「MVx」は、Viewとそれ以外をどうつなぎ合わせるかのアーキテクチャ
"それ以外"ってのが肝で、"x"にあたる"つなぎ方"以外は全部Modelとし表現してる。この解釈を間違えると"x"にビジネスロジックが入り込んでまさかりが飛んでくる。

「Layered Circle(Hexagonal/Onion/Clean Architecture)」は、ドメイン(ビジネスルール)とそれ以外をどう分離するかのアーキテクチャ
Hexagonal / Onion / CA は細部(表現)は違えど目的は同じ。
如何にドメイン(ビジネスルール)を外的要因から隔離し、ドメイン(ビジネスルール)をCleanに保つか、これが肝。

これらは視点が異なる。 だから、同列に並べてどちらかを取捨選択するものでもない。組み合わせられるものは組み合わせればいいし、コンセプトの違いで組み合わせられないものはそもそも選べない。

MVx

MVC」、「MVP」、「MVVM」などが存在するが、詳細は各々調べて自分なりの解釈を探ってもらうとして、雑に筆者の解釈を記すと、

「C」は入力を受けて「M」に処理を依頼、「V」を選択して出力する。「C」が入力を受けるためにフレームワークを使ってルーティングすることが多い。「V」から直接入力されるわけではない。

f:id:yotiky:20180926043432p:plain

「P」は「V」のイベントをハンドリングして「M」に処理を依頼、その結果を「V」に反映する仲介役。「P」が主体となり「V」と「M」を調整する。(PassiveとかPushとかいう方)

f:id:yotiky:20180926043441p:plain

VM」は「V」に最適化されたデータオブジェクト。「V」と表裏一体にくっついてて、「P」のようにイベントをハンドリング、または「V」から叩かれたりして「M」を呼ぶ。「V」は「VM」と、「VM」は「M」とバインディングすることで、「M」の値の変更通知を「VM」が受け自身に反映する。また「VM」の変更通知は「V」へ伝播し「V」が更新される。

f:id:yotiky:20180926043448p:plain


凡例
f:id:yotiky:20180928024130p:plain

  1. 関連。矢印の先端を参照することを意味する。矢印の先端に依存する。
  2. 関連に対する戻り値。矢印の先端に対して値が戻される。
  3. 事前にバインディングすることで、イベント通知または値の変更通知が矢印の先端に対して発行される。双方向の場合、値の変更通知が双方向の場合と、イベント通知と値の変更通知が混合されてる場合も含む。
  4. 関連に対する「実質の呼び出し」として使用した。

MVVMの関連について

MVVMを極めし人々は、View→ViweModel、ViewModel→Modelにおいてはvoidのメソッドを叩き、変更通知が伝播することでViewに結果が投影されるという。 1
WikipediaによるとMVVMの提唱者はMSのJohn Gossmanらしく、2005年のBlog 2ではデザイナーとの作業の分離に着目して書かれてて、要はViewとそれ以外を分離してどう紐付けるかの話をしている。分業に夢を抱いて大きく舵を切ってた時代。
一方で国内WPF界隈で発展したMVVMに関する知見は、個人的には哲学的に昇華したという捉え方で、実務においてはそこに囚われすぎ無くても良いと思っている。具体的には、ViewModel→Modelにおいては、ケースバイケースで戻り値を持つメソッドを叩いてもいいのでは、と考える。

f:id:yotiky:20181031024402p:plain

ViewModel→Modelにおいてvoidのメソッドを叩くのが引っかかるのは、変更通知の伝播が最低2層、Model内で伝播が発生すると3層以上になってしまう点。
手に乗るサイズのコード量であれば気にしすぎなケースもあれど、多人数での作業だったりコードに歴史が重ねられると何が何に関連しているか把握しづらくなってしまう。
ViewModel層で介在(フィルタ)したり、伝播の粒度(束ねたり)なんかも気にしたくなるケースがあったりなかったり。水の波紋のように中心に触れると綺麗に広がってくのは気持ちが良いとは思うけど。

Layered Circle

参考にさせていただいたサイトによると、Hexagonal Architectureが2005年(PoEAA的には2002年?)、Onion Architectureが2008年、Clean Architectureが2013年に提唱されたようだ。

Hexagonal Architecture

PoEAAでパターンとして提唱されたものらしい。
目的は、自動化された回帰テスト
本質は、「内部(アプリケーション)」を「外部」から切り離すこと。
主なキーワードは、アプリケーション、ポート、アダプター、外部デバイス
テストを外部デバイスGUIやDB)に依存せず、ドライバー/モックを使ってアプリケーション(ビジネスロジック)だけを繰り返しテストさせるためのアーキテクチャ、というかパターン。
サンプルはあるもののそういう風にしようぜってだけで、具体的にアーキテクチャとしてどう組もうまではなさそう、回帰テスト目的なのでそこまでってことか。 ポートは差込口で、アダプターはそのポートに差し替え可能な外部デバイスとの繋ぎ部分。例えばDBアクセスのロジックとそれに差し替わるMock(これは外部デバイスないので自身で完結)は、一つのポートにぶら下がるアダプターとなる。
ポートは6個あるわけではなく、複数あるよってことでHexagonの形。

f:id:yotiky:20180926043543p:plain

他のアーキテクチャの影響を受けて、解釈は大きく、進化してそうな気配はある。


凡例
f:id:yotiky:20180928024318p:plain

  1. インターフェイス
  2. 実現。インターフェイスを実装することを意味する。

Onion Architecture

提唱者はMicrosoft MVPっぽい。Microsoft のテクノロジがベースとなったアーキテクチャのようだ。
目的は、あまり安定しない(変化しやすい)コードから影響を受けないようにすること。
主なキーワードは、外周のUser Interface, Infrastructure, Testsと、
Application Core と呼ばれる内側3層がApplication Services, Object Services, Object Model。

Infrastructureを外部化しアダプターコードを間に置くことで疎結合にする事は、Hexagonal Architectureと同じとなる。ただ、ドメインをCleanに保つこと自体を目的とはしておらず、副次的にそうなると言った感じか。事実DDDの有無にはかかわらず機能するとなっている。

原典によると、小規模なWebサイトには適していないし、複雑なアプリケーションや寿命の長いビジネスアプリケーションに適しているとなっている。これはBehavior Contracts(動作の取り決め)のためにInterfaceの使用を強要し、依存関係逆転によりInfrastructureの外部化を強制するため。

OnionにおけるInfrastructureはData層に当たると思われるが、レイヤードアーキテクチャの図ではUIからも参照されてて謎めいているが、Utility Servicesを含みそうな書き方なのでその矢印だろうか、、Part3においてUIからInfrastructureへの矢印は消えているのだが、、、罪深い。

f:id:yotiky:20180926043550p:plain

Onion Architectureの特徴の一つは、他のアーキテクチャではレイヤーは隣接するレイヤーに結合するのに対し、Onion Architectureは内側であればレイヤーを跨いで結合することができる点にある。
変化しやすいコード、User InterfaceおよびInfrastructureの実装部分は外周におき、内部のビジネスルールはInterfaceを使った関連を築き、処理を実装する。
必須ではないものの、IoC(Inversion of Control:制御の反転)コンテナ、DIコンテナ等を使うことを強くお勧めしている。

f:id:yotiky:20180926043557p:plain

Clean Architecture

Hexagonal、Onion、その他いくつかのアーキテクチャを受けて焼き直したアーキテクチャ
目的は、フレームワーク、UI、DB、外部機能からビジネスルールを独立し、さらにそれだけでテスト可能とすること。
表現が違うだけで本質は同じ。ビジネスルールを外的要因から分離する。
主なキーワードは、
Frameworks&Drivers : UI, Web, DB, Devices, External Interfaces
Interface Adapters : Controllers, Presenters, Gateways
Application Business Rules : Use Cases
Enterprise Business Rules : Entities

ビジネスルールはフレームワーク、UI、DBから独立しており、そのためUIはウェブからコンソールへビジネスルールの変更なしに置き換えられる。 一番外側は外的なモジュールやツール、DB、UIだとUIで使われるフレームワークやライブラリ、その他諸々の業務の関心ごと以外となる外的要因。

f:id:yotiky:20180926043608p:plain

個人的解釈のポイント。

EntityはEnterprise Business Rules層に属しており、ビジネスルールをカプセル化するので所謂POCOではない。ドメイン、ビジネスルールと呼ばれる部分。システム化することに依存しないビジネスルール。

Use CaseはApplication Business Rules層で、上記ビジネスルールをシステム化することで必要となる繋ぎ、Facade的な役割を持つ。EntityはUse Caseの影響を受けないとなるので、真ん中にもやはりInterfaceが必要なのかもしれない。

Interface Adapters層ではアプリケーション内部のビジネスルールに適したデータ形式と、外部で利用するのに適したデータ形式とを変換する。また外側のFrameworks&Drivers層とApplication Business Rules層の処理の橋渡し役となる。

原典によると、「MVC」は、Mは単なるデータ構造とし、VCはInterface Adapter層ってことで説明されてる。Controllerは入力を受けて処理を依頼し、UseCaseでEntityを経由(ビジネスルール)したのち、Presenterが出力を仲介する。(なぜかPが登場...)

Frameworks&Drivers層は、DBやWebフレームワークとなっている。DBそのものはアプリケーションの境界外であるはずなので外に追い出して、そことの繋ぎ(Driverやそのラッパーあたり)を持ってきた。それは詳細を知っていて詳細をすべて内包する形で影響を閉じ込める。

境界をまたがるいたるところで、依存関係逆転の原則、すなわちInterfaceと実装による疎結合が使われるとあるのでこのような実装になると思われる。
境界を流れるデータについても、外側の円において、内側の円にとって使いやすい形にすることになるだろう。(データを使い回さず各層で詰め替えるならば)Interfaceが内側の円にあるので自然とそうなるはず。

参考にさせて頂いたサイト

CEDEC2018 セッション資料・レポート一覧

見つけたセッション資料やレポートのリンク集です。 公式で公開されるまでは、折を見て更新していく予定。 これもあるよってのあれば教えて頂けると幸いです。

※公式で資料公開されてるので以降更新されません。CEDiLを参照ください。
また動画の一部はCEDECチャンネルYoutube版で見れるようです。

資料

レポート

各サイト一覧ページ

DAY 1

  • 基調講演
  • 明快で軽快! Nintendo SwitchのUI

  • オンラインゲームのこれまでとこれから

    • 「オンラインゲームのこれまでとこれから」を国内主要オンラインゲームのスタッフが語る【CEDEC 2018】Gamer
    • オンラインゲームの過去と未来を大討論! ロングセッションをガッツリお届け!! 【CEDEC 2018】ファミ通.com
  • VIVE

  • 女神転生 UIデザイン制作方法

    • CEDEC 2018】アイトラッカーユーザーテストがキーとなる『D×2 真・女神転生リベレーション』での新しいUIデザイン制作方法の試みと発見 Social Game Info
  • トキメキとは何か

    • 乙女に愛されるキャラクターはどう作る? 乙女向け目覚ましアプリ『MakeS-おはよう、私のセイ-』ディレクターが語る制作術【CEDEC 2018】 ファミ通.com
    • CEDEC 2018]「女性が伴侶を選ぶポイント」を分析し,魅力的なキャラクターを生み出す。「トキメキとは何か ~乙女を恋へと導く新たなアプローチ~」レポート 4Gamer.net
    • 乙女を恋に導くための仕掛け―「MakeS -おはよう、私のセイ-」セッションレポート!【CEDEC 2018】Gamer
  • ハシラスVR

    • CEDEC 2018]「大規模VRはオンラインゲームに近い」ハシラスが目指す最先端VRの先にあるもの GamesIndustry
  • FFXIVエス

    • CEDEC 2018】「FFXIV」はなぜ500個単位のクエストを実装できるのか? GAME Watch
    • FFXIV」のクエストはこのように作られていた! 秘蔵資料も飛び出したセッションをレポート【CEDEC 2018】Gamer
  • esports

  • Vtuberのビジネス

    • CEDEC 2018]バーチャルYouTuberの課題は罰ゲーム? 同時運用の苦労などが語られた講演「Vtuberのビジネスの最新動向と必要とされる技術について」をレポート 4Gamer.net
    • CEDEC 2018 Vtuber事業で必要な技術や機材とは? CyberVがめざす次代のVtuber表現 SPARKが選んだVtuber関連機材 IGN
  • オートプレイによる最適なパラメータシミュレーション

    • CEDEC 2018】『ダンまち~メモリア・フレーゼ~』運用チームが導入するオートプレイによる最適なパラメータシミュレーションの枠組みとは? Social Game Info
  • ゼノブレイド2のレイマーチング

  • SpriteStudio

    • 汎用2Dアニメーション作成ツール「SpriteStudio」最新バージョンの新機能とは【CEDEC 2018】インサイド
  • ハリウッド映画音楽

  • 弱いロボット

    • CEDEC 2018]ロボットと人間の関係性に注目した「弱いロボット」の可能性 4Gamer.net

DAY 2

DAY 3

HoloLens(実機)でリモートデバッグする

HoloLensの実機でアプリをデバッグするにはどうしているでしょうか。

これまでは何となくVisual Studioデバッグを開始(F5)を実行していましたが、毎回アプリのビルド、配置から始まり、コードを変更していないにもかかわらずアプリの起動まで時間を要する作業でした。 加えてHoloLensが眠ってて配置に失敗したり、なぜかアプリの起動で必ず一度コケるなどあるあるですかね?

そんなわけで重い腰を上げてプロセスにアタッチできないか調べてみました。

目次

TL;DR

HoloLens(実機)でアプリをリモートデバッグする手順を紹介します。

開発環境

  • Unity:2017.4.5f1
  • MRTK:2017.4.1
  • VisualStudio:2017
  • OS:HoloLens RS4

手順

  1. Unityが出力したソリューションファイルを開きます。
  2. Visual Studioのメニューで、[デバッグ > その他デバッグターゲット > インストールされているアプリケーションパッケージのデバッグ }を実行します。
  3. image.png (59.0 kB)

USB経由で接続したい場合

  1. USBでHoloLensを接続している場合は、接続の種類で「デバイス」を選択します。
  2. インストールされているアプリ パッケージで、アプリを起動していない場合は実行されていないの中から、アプリを起動している場合は実行中の中から、対象のアプリを選択してアタッチをクリック。

    image.png (59.3 kB)

  3. 成功すればいつもの画面になります。

    image.png (86.4 kB)

Wifi経由で接続したい場合

  1. Wifiの場合はペアリングが必要になります。接続の種類で「リモートコンピューター」を選択して、「変更」をクリック。
  2. リモート接続ウィンドウで、手動で構成にアドレスを入力し、ユニバーサル(暗号化されていないプロトコル)を選択して、「選択」をクリック。

    screenshot.266.png (13.1 kB)

  3. ペアリングがまだの場合ペアリングを求められます。 HoloLens側は Settings > Update & Security > For developers > Device discovery にある「Pair」をクリックするとcode が表示されるので、Visual Studio に入力してペアリングしてください。

  4. インストールされているアプリ パッケージで、アプリを起動していない場合は実行されていないの中から、アプリを起動している場合は実行中の中から、対象のアプリを選択してアタッチをクリック。

    image.png (58.2 kB)

  5. こちらも成功すればデバッグ状態になります。

    image.png (79.5 kB)