【第6回】アプリ構成の4つのルールとスタイルガイド|OutSystems Architecture Specialist 合格対策

ArchitectureSpecialist(O11)

これまでの回では、Architecture Canvasに基づいた「モジュール」単位の設計を学んできました。しかし、OutSystemsにおいて環境間(開発・検証・本番)を移動する最小のデプロイ単位は「アプリケーション」です。

モジュール設計が完璧でも、アプリケーションの切り分けを誤ると、「一つの機能を直しただけなのに、関係ない多数のアプリも一緒にデプロイしなければならない」という密結合の罠に陥ります。第6回では、この渋滞を防ぐための「4つのルール」と、UI戦略の核心を解説します。



1. 適切なアプリケーション構成のための「4つのルール」

OutSystemsは、アプリケーションを適切に分割・構成するために以下の4つの検証ルールを定めています。

ルール#1:モジュールのレイヤー化(Layer your modules)

基本中の基本です。アプリケーション内のモジュールがArchitecture Canvasの原則(上方参照禁止・サイド参照禁止・循環参照回避)に従っていることが大前提です。モジュールレベルで違反がある場合、健全なアプリ構成を築くことは不可能です。

ルール#2:アプリのレイヤー化(Layer your applications)

アプリケーション自体もCanvasのレイヤーに分類されます。そのアプリがどのレイヤーに属するかは、「中に含まれる最上位モジュールのレイヤー」によって決まります。

アプリの種別 含まれる最上位モジュール
End-Userアプリ End-Userモジュールが含まれるアプリ
Coreアプリ 最上位がCoreモジュール(Foundationも含み得る)
Foundationアプリ Foundationモジュールのみで構成されるアプリ

🚫 重要:アプリ間参照もCanvasの原則に従う

CoreアプリがEnd-Userアプリを参照することは「上方参照禁止」違反となり、デプロイ時に不要な依存関係を引き込みます。モジュールだけでなく、アプリ間の参照方向も必ず確認してください。

ルール#3:所有者の混合禁止(Don’t mix different owners)

IT側の責任者(Owner)が異なるチームのモジュールを、1つのアプリに混ぜてはいけません。複数のチームが同じアプリを編集すると、デプロイ時の責任の所在が曖昧になり、管理が極めて複雑になります。責任範囲が分かれるなら、アプリも分けるべきです。

ルール#4:スポンサーの混合禁止(Don’t mix different sponsors)

ビジネスサイドの予算やリリースのペース(Pace)が異なる事業部門(LOB)を同じアプリに混ぜてはいけません。

📝 具体例

更新が非常に速い「マーケティング部」と、安定性を重視する「人事部」が同じアプリを共有すると、遅い方の承認を待たないとリリースできないというボトルネックが発生します。



2. スタイルガイド・アーキテクチャの4つのシナリオ

企業全体のルック&フィール(CSS、ロゴ、共通レイアウト)を効率的に管理するための構成方法です。

シナリオ 特徴・構成 メリット / デメリット
Built-in(組み込み) OutSystems UIをそのまま利用 最小コスト。独自のブランド表現は限定的。
Specialized(特化) 既存テーマを拡張(Extend)して作成 メリット:ベース側の更新を自動で享受できる。
デメリット:CSSインポート増による微細な性能影響。
Clone(クローン) 既存テーマを複製して独立させる メリット:参照が減り、実行時パフォーマンスが最大。
デメリット:ベース側の将来の変更が反映されない。
Bare minimum(最小限) 最小限の構造のみをクローン 既存のどのテーマにも適合しない「完全独自」の最終手段。



3. UIロジック(メニューとログイン)の共有パターン

複数のアプリでスタイルを共有する際、「メニュー」と「ログインフロー」をどこに定義するかでUXが決まります。

シナリオ 構成 用途
Internet App
(ログインのみ共有)
メニューは各アプリのテンプレートに保持。ログインフローは共有テーマ(_thに定義。 各アプリが独自のメニューを持ち、ログイン画面のみ共有したい場合。
Portal
(メニューとログインを共有)
メニューとログインの両方を共有テーマ(_thに定義。 すべてのアプリが単一の入り口を共有する「ポータル」形式。



4. 試験対策:覚え方のセット

試験問題で迷った時は、この「判断基準」をセットで思い出してください。

問われ方 判断基準
アプリの「層」は何? アプリ内の一番「上位(偉い)」モジュールの層を見る。
なぜアプリを分ける? ITチーム(責任)が違う、またはビジネス部門(ペース)が違うから。
パフォーマンス重視なら? 「インダイレクション(間接参照)」を最小化できるCloneを選ぶ。
再利用UI(Block)のCSSは? BlockはBaseテーマ(OutSystems UIなど)に基づかせるのが安全。消費側のCSSを継承するため。



第6回のまとめ

✅ この回のポイント

  • デプロイ単位はアプリケーション:モジュール設計だけでなく、アプリの切り分けがデプロイ速度を左右します。
  • アプリのレイヤーは最上位モジュールで決まる:End-User・Core・Foundationの分類はアプリレベルでも適用されます。
  • アプリを分ける理由は2つ:ITチーム(責任)の違い、またはビジネス部門(ペース)の違いです。
  • スタイルガイドはトレードオフ:更新継承ならSpecialized、パフォーマンスならCloneを選びます。



復習問題:合格への最終チェック!

▶ 問1:あるアプリケーションにEnd-User・Core・Foundationの全レイヤーのモジュールが含まれています。このアプリはどのレイヤーに属しますか?
A. Core  B. Foundation  C. End-User  D. Orchestration

正解:C(End-User)

アプリのレイヤーは、そこに含まれる「最上位モジュール」によって決定されます。End-UserモジュールはCore・Foundationより上位のレイヤーであるため、このアプリはEnd-Userアプリに分類されます。

▶ 問2:LOB(事業部門)ごとにアプリケーションを分割すべき最大の理由は何ですか?
A. ライセンス節約  B. リリースサイクル(ペース)の独立性を守るため  C. DB容量の節約  D. 命名規則の統一

正解:B(リリースサイクル(ペース)の独立性を守るため)

スポンサーが異なればビジネス要求や変更頻度が異なるため、個別にデプロイ可能にする必要があります。異なるペースを持つ部門を同一アプリにまとめると、遅い方の承認待ちがボトルネックになります。

▶ 問3:ITチームごとにアプリを分ける理由はどれですか?
A. UIの統一  B. デプロイの変更責任(Accountability)を明確にするため  C. メモリ消費の削減  D. サーバー負荷分散

正解:B(デプロイの変更責任(Accountability)を明確にするため)

1つのアプリに複数の所有者がいると、誰が何を変えたか不明確になり、管理不能になります。チームの責任範囲とアプリの境界を一致させることで、デプロイ時の説明責任が明確になります。

▶ 問4:最も高いランタイムパフォーマンスを発揮するスタイルガイド構成はどれですか?
A. Specialized  B. Clone  C. Built-in  D. Bare minimum

正解:B(Clone)

クローンはベーステーマへの依存(参照の段数)が一つ減るため、インダイレクションが最小化されます。ベース更新の継承は失いますが、実行時パフォーマンスを最優先にする場合はCloneが最適です。

▶ 問5:「Specialized」シナリオを選択する主な利点は何ですか?
A. ベーステーマの将来の改善を継承できる  B. 開発速度が最速  C. CSSのインポートが不要  D. ライセンスが不要

正解:A(ベーステーマの将来の改善を継承できる)

特化(拡張)シナリオではベースを継承しているため、元のテーマが更新された際にそのメリットを享受できます。パフォーマンスよりも保守性・継続的な改善を優先する場合に適しています。

▶ 問6:「Portalシナリオ」において、メニューとログインフローはどこに定義すべきですか?
A. 各アプリのモジュール  B. 共有テーマモジュール(_th)  C. Core Serviceモジュール  D. 各アプリのテンプレート

正解:B(共有テーマモジュール・_th)

すべてのアプリでメニューとログインを共有する場合、共有テーマ内に集約して管理します。各アプリは共有テーマを参照するだけで、統一されたナビゲーションとログイン体験を提供できます。

▶ 問7:End-Userアプリケーションが別のEnd-Userアプリからアクションを参照しようとした際の正しい対処法は?
A. そのまま参照する  B. 共有したい要素をCoreレイヤーのモジュールへ昇格させ、両方から参照する  C. 参照先をFoundationに移動する  D. REST APIに変換して警告を無視する

正解:B(共有したい要素をCoreレイヤーのモジュールへ昇格させ、両方から参照する)

End-Userアプリ間でのサービス提供(サイド参照)は禁止されており、共通要素はCore層へ切り出すのが原則です。これにより両アプリのライフサイクルを独立させたまま、共通ロジックを再利用できます。

▶ 問8:既存のテーマ構造から全くメリットを受けられない場合、推奨される最終手段は?
A. Clone  B. Specialized  C. Bare minimumをクローンして構築  D. 標準のOutSystems UIを使用

正解:C(Bare minimumをクローンして構築)

どの既存テーマにも適合しない場合の「フォールバック」として、最小限の構造を持つベースから設計します。完全にゼロから作るのではなく、Bare minimumという土台を使うことで最低限の構造は保持します。

▶ 問9:「Internet App」などで、メニューは各アプリ固有だがログインのみ共有したい場合、ログインフローはどこに置きますか?
A. 各アプリのテンプレート  B. 共有のカスタムテーマ  C. 各アプリのUIモジュール  D. CoreレイヤーのAPI

正解:B(共有のカスタムテーマ)

ログインフローのみを共有する場合、そのロジックは共有されるカスタムテーマ内に定義します。メニューは各アプリのテンプレートに持たせることで、アプリごとの独自ナビゲーションとログインの共通化を両立できます。

▶ 問10:アプリケーションテーマ内のBlockが消費側のCSSに馴染む理由はどれですか?
A. Blockが自動でリライトされるから  B. Blockは消費側モジュールのCSSを継承するから  C. BlockにはCSSが一切含まれないから  D. 命名規則が同じだから

正解:B(Blockは消費側モジュールのCSSを継承するから)

UIコンポーネント(Block)は、それを呼び出すモジュールのCSSを継承して見た目を適応させます。そのため汎用的なBlockはBaseテーマに基づかせておくことで、どのアプリに配置されても自然に馴染みます。

コメント

タイトルとURLをコピーしました