public interface iUserInfo
{
string getUserName(int userId);
string getUserAge(string username);
}
public class UserDb implements iUserInfo
{
string getUserName(int userId)
{
//code to retrieve user info from the database
}
}
public class UserTxtFile implements iUserInfo
{
string getUserName(int userId)
{
//code to retrieve user info from the plain text file
}
}
public class UserManager()
{
private iUserInfo userInfo;
public string retrieveUserData(string userName)
{
return userInfo.getUserAge(userName);
}
}
私の教授は言う
「上記のユーザー マネージャー クラスには iUserInfo 型の参照変数があるため、この参照がファクトリ メソッドまたはその他の手段によって提供される場合、マネージャー クラスのコードは、提供される実装に関係なく同じになります。
このアプローチは、ソフトウェア開発の過程で一部の実装を変更する必要がある場合に、より高いレベルのレイヤーがまったく影響を受けないため、柔軟性を最大限に高めます。」
理解しておく必要があることが 2 つあります。柔軟性の最大化とファクトリーメソッド。
後者はこんな感じかもしれません
public class UserManager()
{
private iUserInfo userInfo;
private UserTxtFile uTxtFile;
private UserDb uDB;
public iUserInfo GetUserInfoObjFactory(bool dbOrTxt)
{
return dbOrTxt? uTxtFile:uDB;
}
public string retrieveUserData(string userName)
{
return userInfo.getUserAge(userName);
}
}
講義中、私は他のことについて空想にふけっていましたが、今ではそれが何を意味するのか理解できません。一部のインタビュアーが、答え方がわからない未解決の質問で私を攻撃する可能性がある場合に備えて、もう少し詳しく理解したいと思います.
高レベルのレイヤーが影響を受ける場合の例で、上記のソースを壊すコードを追加していただけますか? 本当にありがとうございました。
[更新]「一般的なメソッドをグループ化するためのインターフェイスが必要です」などの回答も、あまり説得力がありません。抽象基本クラスだけでも役立ちます。たとえば、2 つのオブジェクト {Penguin vs Bird} からの Fly 動作。インタビュアーに IFly が必要だと簡単に言うことはできません。Fly を必要とする何百万もの異なるオブジェクトがある場合でも、それぞれの Fly をいつでも実装できます。IFly を設計する場合でも、実装クラスでそれを行う必要があるためです。より詳細なケースを提供するか、インターフェイスがどのように必須になるかを再度説明してください。