・抽象化は大事とか聞くけど、結局何に使うんだろう?
・理解したところで役に立つの?
という人は多数要ると思います。
この日記では「抽象化が必要」の具体例である、複数ライブラリ間のキーボードを実装してみたいと思います。
(似たような案件を掲示板で見かけた気がするので)
オブジェクト指向的発想としては、
「どの部分が変更されそうか」が重要になると考えています。
オフトピック
※1 C++の場合、コード量が増えそうなのでC#で書きます
※2 実在しないDxLibラッパーを使用しています
※3 実際には有用ではないクラスが出来上がりました
※2 実在しないDxLibラッパーを使用しています
※3 実際には有用ではないクラスが出来上がりました
次のコードは、とりあえずDxLibの環境でキーボードを実装してみた例です。 このクラスは、変化に対して柔軟でしょうか?
DxLibとしてのキーボードの役割を果たせそうですが、
.NET Frameworkとしてのキーボードの役割は果たせそうにありません。
(キーコードがintではなくSystem.Windows.Input.Keyであるため)
これら二つのキーボードの違いを見ると、キーコードの型を変更できれば実装できそうです。
そこで、次のようなインタフェースを設けてみます。
オフトピック
しれっとジェネリクスの機能を使用していますが、近年の言語では大体似たような機能があるので問題ないと思います。
ジェネリクスの機能が無い場合、KeyCode自体を抽象化するかもしれません。
ジェネリクスの機能が無い場合、KeyCode自体を抽象化するかもしれません。
// DxLibとしてのキーボード
public class DxLibKeyboard : IKeyboard {
public bool IsKeyDown(int keyCode) => DxLib.CheckHitKey(keyCode);
}
using System.Windows.Input;
// .NET Framewrokとしてのキーボード
public class DotNetFrameworkKeyboard : IKeyboard {
public bool IsKeyDown(Key keyCode) => Keyboard.IsKeyDown(keyCode);
}
めでたし。めでたし。
[hr]
正直のところ、キーボードを抽象化しても良い事は殆どありませんが、
「二つのライブラリのインタフェースが違うから実装できない」の解決策として、良い例となったのではないでしょうか。