はい、オーバーロードは簡単に使いすぎてしまう可能性があります。
過負荷が正当化されるかどうかを判断するための鍵は、聴衆を考慮することです。コンパイラーではなく、数週間、数か月、数年で登場し、コードが何であるかを理解しなければならない保守プログラマーです。達成しようとしています。
GetProducts() のような単純なメソッド名は明確で理解しやすいものですが、多くのことが語られていません。
多くの場合、GetProducts() に渡されるパラメーターに適切な名前が付けられていれば、保守担当者はオーバーロードが何をするかを理解できますが、それは使用時に適切な命名規則に依存しているため、強制することはできません。強制できるのは、呼び出しているメソッドの名前です。
私が従うガイドラインは、交換可能な場合、つまり同じことを行う場合にのみ、メソッドをオーバーロードすることです。そうすれば、クラスのコンシューマーが呼び出すバージョンは同等であるため、気にしません。
説明のために、DeleteFile() メソッドのオーバーロードを喜んで使用します。
void DeleteFile(string filePath);
void DeleteFile(FileInfo file);
void DeleteFile(DirectoryInfo directory, string fileName);
ただし、あなたの例では、別の名前を使用します。
public IList<Product> GetProductById(int productId) {...}
public IList<Product> GetProductByCategory(Category category) {...}
public IList<Product> GetProductByName(string Name ) {...}
フルネームを使用すると、保守担当者 (おそらく私) にとってコードがより明確になります。署名の衝突の問題を回避します。
// No collisions, even though both methods take int parameters
public IList<Employee> GetEmployeesBySupervisor(int supervisorId);
public IList<Employee> GetEmployeesByDepartment(int departmentId);
目的ごとにオーバーロードを導入する機会もあります。
// Examples for GetEmployees
public IList<Employee> GetEmployeesBySupervisor(int supervisorId);
public IList<Employee> GetEmployeesBySupervisor(Supervisor supervisor);
public IList<Employee> GetEmployeesBySupervisor(Person supervisor);
public IList<Employee> GetEmployeesByDepartment(int departmentId);
public IList<Employee> GetEmployeesByDepartment(Department department);
// Examples for GetProduct
public IList<Product> GetProductById(int productId) {...}
public IList<Product> GetProductById(params int[] productId) {...}
public IList<Product> GetProductByCategory(Category category) {...}
public IList<Product> GetProductByCategory(IEnumerable<Category> category) {...}
public IList<Product> GetProductByCategory(params Category[] category) {...}
ソース管理への最初のチェックイン後にコードに戻らなくても、コードを書いている間にそのコード行を数十回読むことになります。続くコード。
最後に、使い捨てのコードを書いている場合を除き、他の人が他の言語からあなたのコードを呼び出すことを許可する必要があります。ほとんどのビジネス システムは、使用期限を過ぎても本番環境にとどまるようです。2016 年にクラスを使用するコードは、最終的に VB.NET、C# 6.0、F#、またはまだ発明されていないまったく新しいもので記述される可能性があります。言語がオーバーロードをサポートしていない可能性があります。