gihyo.jpのMisskey連載第2回: MisskeyにおけるNest.jsを使ったDI

Misskey/news
概要

2023-02-13に公開された「gihyo.jpのMisskey連載第1回: 分散型SNS「Misskey」、それを支える技術スタック | GNU social JP」の連載に続く2回目の連載「MisskeyにおけるNest.jsを使ったDI | gihyo.jp」が公開されたので紹介します。

以下の投稿で告知されていました。

avatar
Misskey連載第二回が出た Nest,jsを使ったDIについて解説しています
MisskeyにおけるNest.jsを使ったDI | gihyo.jp
本連載では分散型マイクロブログ用ソフトウェアMisskeyの開発に関する紹介と、関連するWeb技術について解説を行っています。第2回はMisskey v13から採用されたNest.jsおよびDependency Injection(DI)と呼ばれる設計手法について紹介します。

なお、私はこの公開の認知に遅れ、2023-04-01の以下の投稿で存在を認知しました。

avatar
ぐぬ管 (GNU social JP管理人)|gnusocialjp@gnusocial.jp
!sns 3/22にgihyo.jpのMisskey連載第2回が公開されたようです。全然気づきませんでした。 MisskeyにおけるNest.jsを使ったDI
MisskeyにおけるNest.jsを使ったDI | gihyo.jp
本連載では分散型マイクロブログ用ソフトウェアMisskeyの開発に関する紹介と、関連するWeb技術について解説を行っています。第2回はMisskey v13から採用されたNest.jsおよびDependency Injection(DI)と呼ばれる設計手法について紹介します。
内容

内容はMisskey v13で導入されたNest.jsによるDI (Dependency Injection) の説明でした。DIはメンバー関数間のクラスの依存関係を緩和する方法で、関数の単体テストをしやすくする手法です。

ファイルグローバル関数や、インスタンスのメンバー関数などを、他の関数内で使うと、その関数・クラスに依存してしまい、単体で動作させる場合に依存部分のモック・スタブへの置換が困難になります。

この回避には、例えば関数の引数にデリゲートインスタンス (Delegate=代理、代表。使用したいクラスのメンバー関数、コールバック関数を寄せ集めただけの代理のクラス) を渡して、関数内部でデリゲートインスタンスのメンバー関数を使います。こうすることで、引数のデリゲートインスタンスを置換することができ、単体試験がしやすくなります。

記事内では、試験対象のクラスのメンバー変数にデリゲートインスタンスを持たせて、メンバー変数経由でアクセスする例となっていました。やっていることは同じです。フレームワークを使わなくても自分でそういうクラスを作って使えば同じことはできます。

一般的には、XDelegateというに末尾がDelegateの名前のクラスを使うようなイメージですが、Nest.jsはそういう命名規則ではないようです。Nest.js自体はDI以外にもいろいろ機能があるものの、Misskeyでは主にDI部分のみを使っているそうです。

ただの手法なので、例えばオブジェクト指向の存在しないC言語であっても、関数ポインターをメンバー変数に持たせた構造体でデリゲートを表現するなどすれば、同じことはできます。

結論

Misskey連載第2回のDIの話でした。Misskey内部での使用技術の話でした。

2022年11月末にドメインブロック (告知: Misskey.ioからのドメインブロック | GNU social JP) される前に、しゅいろがDIのことについて言及していたことを覚えており、その際の取り組みの紹介でした。

Web技術の話がくるかと思っていましたが、一般的な手法のライブラリーの話で、やや予想外でした。

前回が2/13で今回が3/22の投稿ということで、だいたい月1くらい投稿頻度になるようです。次回4月下旬と思いますので、次回は見逃さないように注意します

コメント

Copied title and URL