Kamuya açıklanması amaçlanan bir kütüphane geliştiriyorum. Nesnelerin kümeleri üzerinde çalışmak için çeşitli yöntemler içerir - kümeleri oluşturmak, incelemek, bölümlemek ve kümeleri yeni biçimlere yansıtmak. İlgili olması durumunda, IEnumerable
NuGet paketi olarak piyasaya sürülecek LINQ tarzı uzantıları içeren bir C # sınıfı kütüphanedir .
Bu kütüphanedeki yöntemlerden bazıları tatmin edici olmayan giriş parametreleri verilebilir. Örneğin, birleşik yöntemlerde, bir m öğesi kaynağından oluşturulabilecek tüm n öğesi kümesini üretmek için bir yöntem vardır . Örneğin, set verildiğinde:
1, 2, 3, 4, 5
ve 2 kombinasyonunun istenmesi şunları üretecektir:
1, 2
1, 3
1, 4
vb ...
5, 3
5, 4
Şimdi, 3 maddeden oluşan bir set vermek ve ardından her bir maddeyi yalnızca bir kez kullanabileceğini belirten seçeneği belirlerken, 4 maddeden oluşan bir kombinasyon istemek gibi, yapılamayan bir şeyi istemek açıkça mümkün.
Bu senaryoda, her parametre ayrı ayrı geçerlidir:
- Kaynak koleksiyonu boş değil ve öğe içeriyor
- İstenen kombinasyon boyutu pozitif olmayan sıfır tamsayıdır
- İstenen mod (her öğeyi yalnızca bir kez kullanın) geçerli bir seçimdir
Ancak, birlikte alındığında parametrelerin durumu sorunlara neden olur.
Bu senaryoda, yöntemin bir istisna (örneğin InvalidOperationException
) atmasını veya boş bir koleksiyon döndürmesini bekler misiniz ? Her ikisi de benim için geçerli görünüyor:
- Sen kombinasyonlarını üretemez n kümesinden öğeleri m öğeleri nerede n> m sadece bir defa her öğeyi kullanma izni, bu nedenle bu işlem dolayısıyla imkansız varsayılması durumunda
InvalidOperationException
. - N> m boş bir set olduğunda , m öğelerinden üretilebilecek n boyut kombinasyonları kümesi; hiçbir kombinasyon üretilemez.
Boş küme argümanı
İlk endişem, bir istisnanın, bilinmeyen büyüklükteki veri kümeleriyle çalışırken yöntemlerin deyimsel LINQ tarzı zincirlemesini önlemesidir. Başka bir deyişle, böyle bir şey yapmak isteyebilirsiniz:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
Girdi kümeniz değişken boyuttaysa, bu kodun davranışı öngörülemez. Eğer .CombinationsOf()
bir özel durum atar someInputSet
4'ten daha az öğesi vardır, o zaman bu kod olacak bazen bazı ön denetimi olmadan zamanında başarısız. Yukarıdaki örnekte bu kontrol önemsizdir, ancak daha uzun bir LINQ zincirinin yarısına kadar çağırıyorsanız, bu sıkıcı olabilir. Boş bir küme döndürürse, result
tamamen memnun olabileceğiniz boş olacaktır.
Bir istisna argümanı
İkinci kaygım, boş bir setin geri dönmesinin problemleri gizleyebileceğidir - bu yöntemi bir LINQ zincirinin yarısına kadar çağırıyorsanız ve sessizce boş bir küme döndürürseniz, daha sonra birkaç adımda sorun yaşayabilir veya kendinizle boş Sonuç kümesinde ve giriş kümesinde kesinlikle bir şey olduğu göz önüne alındığında bunun nasıl gerçekleştiği açık olmayabilir.
Ne beklersiniz ve bunun konusundaki argümanınız nedir?