Yeni System.Tuple sınıfı kötü tasarım kullanıyor mu?


19

System.Tuple kavramını beğendim, çünkü yeni bir sınıf oluşturmadan tek bir işlev çağrısında birden fazla parametre döndürmeme izin veriyor, ancak bu, Microsoft Patterns & Practices, SOLID Principles, vb.Gibi iyi programlama uygulamalarına meydan okuyor.

Ben sadece bu özelliği ne kadar liberal olarak kullanmam gerektiğini ya da sadece gerektiğinde uç senaryo senaryolarında kullanmam gerektiğini ölçmeye çalışıyorum.


+1: Mükemmel soru. Ayrıca - Anders Hejlsberg'in buna ağırlık verip vermediğini merak ediyorum.
Jim G.

Yanıtlar:


11

Kullanmayla ilgili sorun Tuple, genel tip parametrelerinin anlam taşımadığıdır.

Okunabilirlik için özel bir sınıf veya adlandırılmış üyelerle anonim bir tür kullanmayı düşünebilirsiniz.


XML parametresi açıklaması ne olacak? Bakmak için değil en belirgin yer, ama hiçbir şey daha iyi.
John Bubriski

@SkippyFire - Ne demek istiyorsun? Elde ettiğiniz tek şey T1, T2vb. Türüdür. Size ne anlama geldiğini söylemez.
Oded

2
Şunu söylemeliyim: Ben (ya da ekibimizdeki bir kişi) bir tip olarak bir Tuple kullandığında, kodun diğer kısımlarına sürekli .Item1, .Item2, vb. Tamamen önemsiz olmayan her şey için ayrık sınıflar oluşturun. Gelecekte ne yaptığınızı bilmek için kendinize bir şans verin.
Joe

@Oded Bir Tuple kabul eden bir yönteme XML belgeleri ekleme hakkında konuşuyorum . Yine, mükemmel değil, ama Tuples kullanmak / ihtiyacınız varsa hiçbir şey daha iyi.
John Bubriski

1
@Oded Ayrıca, parametre veya dönüş değeri anlam taşımayabilir, ancak yöntemin adı olabilir. Diyelim ki a GetTopTwoPercentages()döndüren bir yönteminiz var Tuple<decimal, decimal>. Bu yeterince açık olabilir.
John Bubriski

8

En önemli kod kalitelerinden biri okunabilirliktir. Öyleyse kendinize sorun:
Ben (yani sizden başka herhangi birinde) yöntem imzasına baktığımda, ilgili bileşenlerin ne anlama geldiğini biliyor muyum Tuple?
Örneğin, geri döndürdüğünüz şamandıra çifti bir dizi kutupsal koordinatsa, bu açık mı?

Bu temiz:

Tuple<Float, Float> getPolarCoords();

Bu yanıltıcıdır (çünkü Kartezyen koordinatları alacağı için):

Tuple<Float, Float> getCoords();

Ve bu anlamsızdır:

Tuple<Float, Float> getTuple();

Genel olarak konuşursak, her durum için netliği değerlendirir ve gerekirse yeniden düzenleyici olur. TupleBirçok farklı yerde olduğu gibi aynı tür verileri temsil ediyorsanız , bir sınıf oluşturmak kesinlikle iyi bir fikirdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.