ビジネスロジックにおいて用いられるさまざまな値を表現するもの.
「金額=単価*数量」であれば,「金額」「単価」「数量」がValueObjectである.
設計モデル的な話
プリミティブ型はシステムに最適な値の表現ではないため,クラスによってラップしてValueObjectとすることで利用する.
値の性質とは
User
-> UserId
and UserName
」がひとつの集約の例. User
は UserId
や UserName
を直接公開しない.// 単純な集約の例
class ShippingCharge {
// 送料計算に必要な値
Product product;
ShipTo shipTo;
Amount total() {
// 値オブジェクトを組み合わせた送料の計算
}
}
ビジネスロジックにおいて用いられるさまざまな値を表現するもの.
「金額=単価*数量」であれば,「金額」「単価」「数量」がValueObjectである.
設計モデル的な話
プリミティブ型はシステムに最適な値の表現ではないため,クラスによってラップしてValueObjectとすることで利用する.
値の性質とは
SmalltalkでAlan Curtis Kayによって初めて名付けられた.
Simulaが初出.
オブジェクト指向は現実世界をそのまま表現できるものという主張がある
(2020/10/20)
同意できない.関係性や依存関係,オブジェクトの粒度のベストプラクティスが異なるため.
オブジェクト指向におけるオブジェクトとはデータとそれに対するメソッドをまとめたものを指す.
C++ではCとの互換性からクラスの情報をプログラムの開始時に一括で読み込む.
Javaや.NETではクラスが必要になったタイミングで情報を読み込む.
実行時パフォーマンスの低下
メモリ使用量の低減
ネットワーク越しに管理されるファイルの結合容易性.
別名: ドメインロジック.
Modelはビジネスロジック.
-> クライアントコード
データとそれに対するメソッドをオブジェクトとして一体化し,外部から隠蔽すること.
オブジェクトの内部のデータ構造や実装が変わっても影響が最小限になる.
ドメイン駆動設計の概要
特徴的なのは以下の3点
複雑なビジネスロジックに焦点を合わせる
これがドメイン駆動設計においてユニークである.
ビジネスルール
ドメイン駆動設計においては,全体を俯瞰して整理するための戦術的設計を指す.
モジュール名はユビキタス言語に含むべき重要な語彙であり,競争優位性につながるものがトップレベルのモジュール名になる.
短文としてドメインモデルを説明できるモジュール名になっていれば,複雑なビジネスロジックに焦点を置いた良いモジュールになっていると考えられる.
モジュールの配下に,複雑なビジネスロジックを表現する集約とValueObjectが集められる.
コアコンピタンスであり,複雑なビジネスロジックによって実現されるもの.
ビジネスルールがなぜ必要で,競争優位性をどのように生み出しているのかという分析が重要である.
コアドメインを特定して言語化および構造化に役立つのが集約である.
ドメイン駆動設計
アプリケーションがデータストアなど外部と接触するロジックと,接触しないロジックの境界に設置するinterface.
永続化も再構築もRepositoryを仲介する.
削除もRepositoryが提供する.
更新はRepositoryで行わない.
更新系と参照系で異なるモデルを用意するアーキテクチャ.
サーバの機能を副作用ありのコマンドと副作用なしのクエリに分けて管理しようという考え方.
ドメイン駆動開発において,複数の集約の値を組み合わせた結果を返す場合などに,更新系と同じモデルでは組み合わせる場合の処理が複雑になってしまうことへの一つの回答.
参考
https://little-hands.hatenablog.com/entry/2019/12/02/cqrs
CEDEC 2021での株式会社アプリボットによる講演.
開発スピードとメンテナンス性の両立が重要.
設計が重要
多人数の開発では自己流の設計が発生する.
チーム内での思想の統一・実績のある体系化された仕組みが必要.
std::equal(first1, last1, first2, last2)
はふたつの集約オブジェクトが等しいかどうかを判定する.
ここで等しいとは要素の数が等しく,かつ各要素同士が等しいことを指す.
#C++ #std
別名: ドメイン駆動開発
GoFデザインパターンなど様々な知見の集積.
テスト駆動開発を用いる.
ヘキサゴナルアーキテクチャが特徴的.
かつては階層化アーキテクチャが推奨されていた.
UI
アプリケーション
ドメインとUIをつなげる.
FacadeやControllerに近い.
ドメイン
ユースケースに対応する処理を書く.
ドメイン駆動設計でアプリケーションサービスに対応する.
ビジネスロジックではなく,エンティティの調整に用いられる.
§ 分割
レイヤーの切り離し
以下のように他の部分とは異なる頻度や理由で変更される部分を独立に実装するべきである.
UI
アプリケーション特有のビジネスロジック
表示するためのデータの加工を担当するクラス.
ビジネスロジックから出力を受け取り,表示したい形式に変換してViewに渡す.
これをViewModelと呼ぶ.
Viewでは変換処理をなるべく行わず,そのまま表示できるようにする.
Presenterがあるおかげで,表示形式がどのように変わってもビジネスロジックに手を加える必要がなくなる.
IPv4ではグローバルIPアドレスが枯渇してしまうため設けられた規格.
2001:c900:0ab0:0000:0000:1234:5678:0000
IPv4のサブネットマスクに相当する情報も含むためサブネットマスクは不要.
IPv4と互換性がない問題がある.
IPv6をカプセル化してIPv4とやり取りする技術が使われることになっている.
1つのメソッド内でのネストは1段階まで
elseを利用せず早期リターンを利用する.
すべてのプリミティブ型と文字列をラップすること.
1行につきドットは1つまでとすること.
名前を省略しないこと
デザインパターンの一つ.
Undo機能を実現するためのもの.
ある状態を内部でmementoオブジェクトとして生成して外部に返し,また外部のmementoオブジェクトから内部の状態を再現するような実装を行う.
一般にオブジェクトの状態を再現しようとするとオブジェクトの状態の全てをpublicにし外部から観測し保存する必要があるが,Mementoオブジェクトを介することでカプセル化の崩壊を防ぎながら状態のスナップショットが可能となる.
好きなとこ
静的型付けを採用しており静的解析に強い
型推論も簡潔な構文でストレスフリー
type aliasも簡潔で良い
プリミティブ型を用いたValueObjectとかもtype UserId string
くらい書いておけば良い
別名: 実体
ドメイン駆動設計
ドメインモデルを実装したドメインオブジェクトである.
「顧客」「注文」「商品」などがエンティティに相当する
識別子によって管理されるものはエンティティに相当する可能性が高い.
コンテキスト(モデル)のつなぎ方は主に3通り
モデルの中で連携に関わる部分を共有する.
境界付けられたコンテキストとして分割されているモデルにおいて,それをまたがって共有できるものは存在しえず,境界付けられたコンテキストの与え方に問題がある可能性がある.
自分のモデルを相手のモデルに合わせる.
相手のモデルを自分のモデルに合わせる.
ビジネスで発生したイベントを特定して表現する戦術的設計.
ビジネスルールによる行動によって生じる.
この背景を調べることでValueObjectの発見につながる.
https://github.com/RyotaMurohoshi/ValueObjectGenerator
ValueObjectを生成してくれるSource Generator
getter, setterは不要であるという主張がある.
getterで値を取得してから行うような処理はValueObjectそのものに実装するべきである.
通知オブジェクトを利用する方法もある.
ValueObjectやエンティティなどドメインモデルをソフトウェアで表現したもの.
Pros.
自己文書化
ドメインの変更をコードに反映させやすくなる.
-> ValueObject
クライアントのために何かを行うオブジェクト
ValueObjectやエンティティに記述すると不自然になる振る舞いを記述する.
UserId
の重複確認など.
User
が持つとuser.Exists()
と書いたり,checkObject.Exists(user)
と書いたりして不自然になる.
重複確認がドメインからの要望であればドメインサービスに書くが,アプリケーションの要望であればアプリケーションサービスに記述する.
構造の分析ではなく複数の単語単位で自然言語を翻訳すること.
bank
が同時にmoney
やin
と用いられている場合は「銀行」である場合が多く,flower
やon
と用いられている場合は「土手」の場合が多い.
機械学習によって実現される
対訳のデータをコーパスと呼ぶ
メッセージそれ自体にどのような構造であるかのメタ情報が含まれていること
事前準備などが必要なく,元の状態を高度に復元できる.
{
"type": {
"object": [
ダイクストラが提唱したアイデアで,「正しく動作するプログラムを作成するためにはわかりやすい構造にすることが重要である」というもの.
GOTO文の廃止
1ステップでも短いプログラムが推奨される環境でかつて用いられていた.
ロジックは順次進行・条件分岐・繰り返しの3つだけで表現できる.
生成過程が複雑なインスタンスの生成に責務を持つクラス.
他のオブジェクトを生成するようなコンストラクタであれば,そのオブジェクトの変化に合わせてコンストラクタも変更しなくてはならなくなるため,Factoryを利用する動機になり得る.
ただ漠然とインスタンス化するのではなく,Factoryを導入するべきか検討する習慣を身に付けるべきである.
ドメイン駆動設計入門
Domain.Models.Users.User
とDomain.Models.Users.IUserFactory
のように,同じ名前空間にFactoryを置くべきである.
同一クラスのものはひとまとめに扱われる
インスタンスセグメンテーションでは重なりにも対応できる.
FCN
畳み込み層にはDilated convolutionやAtrous convolutionが用いられている.
Atrous convolutionを用いたモデルがDeepLabである
画像の画素ごとに識別を行うタスク
基本的に画素ごとに識別を行うことはできず,特徴マップを用いて識別を行う.
画像全体を対象とするセマンティックセグメンテーション
物体検出した領域を対象とするインスタンスセグメンテーション
同一クラスのものも区別して行うパノプティックセグメンテーション
特定のクラスに対してあるクラスのデータ数が極端に多い,または少ないデータ.
そのまま機械学習に用いると汎化性能の低下につながる.
アンダーサンプリング
オーバーサンプリング
Synthetic Minority Oversampling Technique
オーバーサンプリングの手法.
少ないクラスを,値が近いデータから予測することでデータを増やす.
SVMとも言われる.
異なるクラスの各データ点との距離が最大になる境界線を求めることでパターン分類を行うもの.
この境界線を求めることをマージン最大化という.
境界線と最も近いデータをサポートベクトルと呼ぶ.
扱うデータが高次元である場合や,線形分類できない場合も想定する必要がある.
入力された画像に対して代表的な物体のクラスを出力するタスク
確信度を出力する.
AlexNetが2012年にILSVRCで優勝して注目を集めた.
MonoGameにおいて2Dゲームのレンダーターゲットを表すクラス.
Texture2Dを継承している
方針
@animationなどで登場と退場のアニメーションをそれぞれ用意する
/* モーダルの初期状態(画面外に配置) */
.modal {
position: fixed;
Block Element Modifier
再利用可能なコンポーネントを作るCSSの命名規則
Block
1つの使い回しができるコンポーネント
見た目ではなく「それが何であるか」についてkebab-caseで命名する
Goで提供されているGoパッケージのregexpを利用する.
Compile()
`で文字列から正規表現のクラスとする
MustCompile()
を利用することで引数の文字列が正規表現として不適な場合にpanicとしてくれる.
import (
"fmt"
.NET MAUIにおいてはマルチプラットフォームとして自然になるようプラットフォームに依存しない処理を書くことが望ましいが,個別のプラットフォームに依存する処理は「Platforms
フォルダ以下に記述する」「#ifを利用する」の2通りの実装が考えられる.
同じ名前空間に同じクラスが存在しても,Platforms
が別であれば共存できる.
C#で提供されているコレクションで,変更時に通知を提供するクラス.
Visual_Studioの機能でJSONをクラスとして貼り付ける機能がある.
通常のペーストと同様に利用できる.
レスポンスを受ける際などに便利.
2023年現在では.NET MAUIにおいてはXAMLを用いたUI作成が主流だが,C#を用いて構築もできる.
C#で書く場合ロジックとスタイルの分離が難しそうだけど,工夫でなんとかなりそうでもある.
汎用なUIコンポーネントをクラスとして実装しておけばXAMLで書くパターンより簡潔にならないかな.
Prismのライブラリ.
INotifyPropertyChangedを実装するためのBindableBaseというクラスが用意されている.
MVVM#64d84c87cbc7da0000f9f025のコードが多少簡潔になる.
public class ViewModel: BindableBase
{
XMLをいいかんじにしたやつ.WPFとかで使われる.
クラスとの対応やデータバインディングなどの機能が拡張されており,C#と組み合わせやすくなっている.
React 16.8から追加されたReactの新機能.
フックとは、関数コンポーネントに state やライフサイクルといった React の機能を “接続する (hook into)” ための関数です。
https://ja.reactjs.org/docs/hooks-overview.html
ステートフルなロジックは再利用が難しい.
高階コンポーネントなどの利用で対応されていた.
C#9.0からの機能で,readonlyでもデータを変更しながらインスタンスを複製することができるようになる.
レコード型
不変型に対するボイラープレートコードを削減できる.
型名の後にコンストラクタ引数を書くことをプライマリコンストラクタと呼ぶ.
docs
出典: https://delicateprogrammer.com/airbnb-vs-standard/
ESLintが従うコーディング規約はAirbnbとStandardとGoogleから一般に選択となるが,Googleは採用率が低いので実質的に2択.
Airbnbが好み
Airbnb
セミコロンが必要.
別名: 最小知識の原則
オブジェクト指向における設計のガイドラインのひとつ.
オブジェクト自身
引数として渡されたオブジェクト
インスタンス変数
オブジェクト指向 on Java
継承をやめましょうという話が5章でされている.
General Responsibility Assignment Software Patterns
オブジェクト指向における設計パターンのひとつ.
別名: AOP
オブジェクト指向の次のトレンドとして注目されていた技術.
ロギングやトランザクションなどアプリケーションの様々な部分に作用する共通な処理を横断的関心と呼び,アスペクトとして独立して記述することでソフトウェアの柔軟性を向上させることを目的とする.
オブジェクト指向では横断的関心はプログラムのあちこちに分散してしまう.
横断的関心をコードの外部に独立して管理し,外部から与える.
オブジェクト指向の考え方をシステムなど上流工程にも適用しようとするもの.
別名: Simula67
プログラミング言語の一つ.初めてオブジェクト指向の概念を導入した言語.
1967年にノルウェーで開発された.
Unified Modeling Language
オブジェクト指向の分析・設計で用いられる表記法.
構造図
クラス図
振る舞い図
オブジェクト指向に対応したデータベース.
データと操作を一体化して扱う.
COM: Component Object Model
Microsoftが開発した技術で,異なるプログラムやコンポーネント間でオブジェクトをやり取りするためのinterface規格.
Amazon S3においてS3バケットを作成するために必要な情報.
バケット名
全世界で一意である必要がある
かつ,DNSの要件を満たす必要がある
バージョニング
コルーチンで処理を想定されているオブジェクトとかをasync/awaitで書けたりしてうれしいらしい
Goなどで用いられるオブジェクトのコンストラクタやライブラリに拡張性をもたらすデザインパターン.
func NewUser(options ...func(*User)) *User {
user := &User{}
for _, option := range options {
option(user)
初期化が完了しておらず正しく動作しないオブジェクト.
ごくせまい界隈で用いられている用語であることに注意.
Goにおけるエラーハンドリングの機能.
panicが発生時,recover()
から取得したオブジェクトからエラー情報を取得することができる.
あらゆる処理でpanicが発生しないことを保証する,または全てのエラーハンドリングを行うことが難しいので,panicが発生し得る場面(配列の要素へのアクセスなど)などを大域的にクラッシュから保護するような用途かな? ?
Splatoon3で実装されたブキ
カバーとアシスト,削りに特化した性能
2023/01/18更新で塗りが強化された
ポイントセンサー/メガホンレーザー5.1ch
強み
ルールの中で唯一戦場が固定されていることが特徴.
各ステージごとに自分のブキが対面で強い位置を2箇所程度見つけておく.
この際,不利でも逃げ道があることも確認しておきたい.
生存ルートも事前に塗っておく.
塗りが大事.
日本語訳ではなくによる解釈
◆必須
状態をMutableにしない
redux-immutable-state-invariantで状態の変化を監視できる.
Immerを用いると意図しない状態の変化を回避できる.
オブジェクトのフィールドが変更不能であること.
フィールドのフィールドなど,ネストしたフィールドは(仕組み上)必ずしもImmutableではない.
https://redux.js.org/style-guide/style-guide#use-plain-javascript-objects-for-state より
Pros.
参照比較によるパフォーマンスの向上
参照の比較によるパフォーマンスの向上はImmutableなオブジェクトならImmutable.jsに限った話ではない.
更新時のパフォーマンスに特化したデータ構造
const [age, setAge] = useState(42)
のように,配列の要素それぞれを変数として取り出すことができる構文.
(2018/09/20)
何もわからない
JavaScriptの構文.配列やオブジェクトから値を別々にシュッと取り出したい時に便利.
らしい.
Jekyllの機能.
オブジェクト
コンテンツの出力場所を指定する.
タグ
ロジックを用いて出力を制御する.
テストの対象が依存しているコンポーネントを置き換え,間接入力と間接出力の可視化や制御を行う.
以下の5種類がある
スタブ: 間接入力を与える
スパイ: 間接出力を検証する
モック: オブジェクト自身が間接出力を検証する
JavaScriptのMapと同様の機能を提供するが,キーがガベージコレクションに回収されるという特徴を持つ.
オブジェクトのみがキーになる
WeakMapからを除いてオブジェクトへの参照がなくなった場合,ガベージコレクションに削除される.
WeakMapはキーの取得をサポートせず,他からのキーへの参照が失われると値を取り出すことができなくなるためガベージコレクションが回収する.
CEDEC 2021での講演
Scene Viewが刷新されスッキリした.
Unity EditorのQoLが向上した.
Visual Scriptingが完全に統合された.
Device Simulatorが完全に統合された.
OpenGIS幾何モデルに基づいている.
GEOMETRY: 抽象クラス
POINT: 0次元のオブジェクト
CURVE: 1次元のオブジェクト
LINESTRING
Interface Description Language: インタフェース記述言語
オブジェクトのinterfaceを記述するために用いられるコンピュータ言語.
たとえばC++のコンポーネントとJavaのコンポーネントの間などに利用できる.
オブジェクトを同期する仕組みを提供するUnityの機能
Transform
変数
RPC
マッチング機能はない.
アクターモデルで並列処理を書くためのRubyの機能.
Ractor間ではオブジェクトの共有がほとんどできず,スレッドセーフになると考えられる.
https://use-the-index-luke.com/ja
前書き
SQLでは「何が欲しいか」だけ書き,「どう機能するか」を見ないで済むので嬉しい.
パフォーマンスが問題になる場合にむしろ逆効果になっている.
インデックスを正しく貼ることがとにかく大事.
Vimのautocmdをグループでまとめるコマンド.
autocmdが設定されている.vimを複数回読み込むと,autocmdがその回数分だけ設定されてしまい複数回発火するようになってしまう.
augroupを利用することでまとめてautocmdの設定を削除できるようになる.
参考
https://alpaca.tc/blog/vim/break-vim-beginners-augroup.html
ある分野の専門家の持つ知識をデータ化することで門外漢でも専門家のように推論や判断ができるようにするAI研究から生じた試み.
ECサイトの閲覧履歴からの商品おすすめなどに応用される.
第2次AIブームで盛んに研究されたが,それほどうまくは行かなかった.
知識獲得のボトルネックの問題がわかってきた
知識ベース
1 チューニングの基礎知識
Webサイトのパフォーマンスの低下はユーザの離脱につながる.
GoogleはCore Web Vitalsを検索順位に考慮している.
SEOの観点からもCore Web Vitalsが重要.
RTTを短くすることが目標と定義できる.
初期リリースにおける理想像とのずれをどうするか
充実した情報をどれくらい作られるか
1000商品を取り扱うECサイトを作りたいが,10商品しかない.
毎日記事が更新されるメディアサイトを作りたいが,週に1回くらいしか更新されない.
10000人が集まる口コミサイトを作りたいが,メンバーががんばるしかない.
ある時間に発生した独立した事象.単なる数値だけでなく単位やカテゴリ,緊急度など正規化された情報が付与されている。例としてリソースの再起動やフェイルオーバ,ECサイトアプリケーションでの購買イベントなど。