私はこれらの操作が何をしているかに依存します。梱包が最大重量まで果物をバスケットに追加することで構成されていると仮定すると、梱包可能にするために果物の重量を知る必要があります。さまざまな種類の果物をパックしたい場合は、別のパッカー クラスを用意することをお勧めします。果物が自分で詰め込んでいるのが不思議です。
public interface IPackable
{
public float Weight { get; set; }
}
public interface IPacker
{
// Returns a list of packages represented by lists of fruits.
List<List<Fruit>> GetPackages(IEnumerable<Fruit> fruits, float maxPackageWeight);
}
public class Packer : IPacker
{
public List<List<Fruit>> GetPackages(IEnumerable<Fruit> fruits,
float maxPackageWeight)
{
var currentPackage = new List<Fruit>();
var packages = new List<List<Fruit>>(currentPackage);
float currentWeight = 0.0f;
foreach (Fruit fruit in fruits) {
var packable = fruit as IPackable;
if (packable != null && packable.Weight <= maxPackageWeight) {
if (currentWeight + packable.Weight <= maxPackageWeight) {
currentPackage.Add(fruit);
currentWeight += packable.Weight;
} else {
var currentPackage = new List<Fruit>(fruit);
packages.Add(currentPackage);
currentWeight = packable.Weight;
}
}
}
return packages;
}
}
新しい機能のために新しいインターフェイスを追加する場合、既存のインターフェイスを変更する必要はありません。これはインターフェイス分離の原則(ISP) と呼ばれ、オブジェクト指向設計の 5 つの SOLID 原則の 1 つです。
注:IPacker
インターフェイスを使用すると、さまざまな種類のパッカーを実装できます。ある実装では、パッケージ内にさまざまな種類の果物を混在させることができますが、別の実装では果物を並べ替えることができます。