ジェネリック メソッド シグネチャの使用方法を学習するために、次のコード例を作成しました。
Customer と Employee の両方のDisplay() メソッドを取得するために、実際にIPerson インターフェイスをPerson 抽象クラスに置き換え始めました。
しかし、ボブおじさんがスコット・ハンセルマンに、それぞれが特定のことを行う小さなクラスをたくさん持つべきであるという単一責任の原則について話していたポッドキャストを思い出して、私は立ち止まりました。 ()およびCalculateSalary()メソッドを使用しますが、CustomerPrinter クラス とCustomerSaver クラスとCustomerSalaryCalculatorクラスが必要です。
それはプログラミングの奇妙な方法のようです。ただし、インターフェースを取り除くことも間違っていると感じたので (非常に多くの IoC コンテナーと DI の例がそれらを本質的に使用しているため)、単一責任の原則を試してみることにしました。
したがって、次のコードは、私が過去にプログラムしたものとは異なります(Display() メソッドを使用して抽象クラスを作成し、インターフェイスを削除したはずです) が、デカップリングと SOLID 原則について聞いたことに基づいて、この新しいコーディングの方法 (インターフェイスと PersonDisplayer クラス) これが正しい方法だと思います。
他の人がこの問題について同じように考えているかどうか、またはこれのプラスまたはマイナスの影響を経験したかどうかを聞きたいです (たとえば、それぞれが特定のことを行う扱いにくい数のクラスなど)。
using System;
namespace TestGeneric33
{
class Program
{
static void Main(string[] args)
{
Container container = new Container();
Customer customer1 = container.InstantiateType<Customer>("Jim", "Smith");
Employee employee1 = container.InstantiateType<Employee>("Joe", "Thompson");
Console.WriteLine(PersonDisplayer.SimpleDisplay(customer1));
Console.WriteLine(PersonDisplayer.SimpleDisplay(employee1));
Console.ReadLine();
}
}
public class Container
{
public T InstantiateType<T>(string firstName, string lastName) where T : IPerson, new()
{
T obj = new T();
obj.FirstName = firstName;
obj.LastName = lastName;
return obj;
}
}
public interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
public class PersonDisplayer
{
private IPerson _person;
public PersonDisplayer(IPerson person)
{
_person = person;
}
public string SimpleDisplay()
{
return String.Format("{1}, {0}", _person.FirstName, _person.LastName);
}
public static string SimpleDisplay(IPerson person)
{
PersonDisplayer personDisplayer = new PersonDisplayer(person);
return personDisplayer.SimpleDisplay();
}
}
public class Customer : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Company { get; set; }
}
public class Employee : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int EmployeeNumber { get; set; }
}
}