SORU
11 ŞUBAT 2014, Salı


Neden Listesi< devralır;T>?

Benim program yapmayı düşünürseniz, ben sık sık böyle bir düşünce zinciri ile başlar:

Bir futbol takımı futbolcuları listesi. Bu nedenle, onu temsil etmek zorundayım

var football_team = new List<FootballPlayer>();

Bu liste sıralaması hangi oyuncu kadrosu listelenmiştir sipariş temsil eder.

Ama takım da kaydedilmiş olması gereken diğer özellikler, oyuncular sadece listenin dışında olduğunu daha sonra anladım. Örneğin, puan çalışan toplam bu sezon, mevcut bütçeden, üniforma renkleri string bir takım adına temsil eden, vb

O zaman bence

Tamam, bir futbol takımı sadece oyuncu listesi gibi, ama ayrıca, bir adı (string) puan (int) çalışan bulunuyor. .NET kendi sınıfıma yapacağım bu yüzden futbol takımları depolamak için bir sınıf sağlamaz. En benzer ve ilgili mevcut yapı edeceğim ondan miras ... List<FootballPlayer>,:

class FootballTeam : List<FootballPlayer> 
{ 
    public string TeamName; 
    public int RunningTotal 
}

Ama a guideline says you shouldn't inherit from List<T> çıkıyor. İyice iki açıdan bu kılavuz kafamı karıştırdı.

Neden olmasın?

Görünüşe göre List is somehow optimized for performance. Nasıl yani? Performans sorunları I List uzatıyorum varsa ne olacak? Tam olarak sonu ne olacak?

Gördüğüm bir başka nedeni List Microsoft tarafından sağlanan ve üzerinde hiçbir kontrole sahip, I cannot change it later, after exposing a "public API". Ama ben bunu anlamakta zorlanıyorum. Ortak bir API nedir ve neden umursayayım? Eğer benim şimdiki proje ve şimdiye kadar bu kamu API olması muhtemel değil mi eğer değilse, güvenli bir şekilde bu kuralı görmezden gelebilir miyim? List miras yaparsamveortak bir API ihtiyacım var, zorluklar var, ne olacak?

Neden bunun bir önemi var mı? Bir liste. Muhtemelen neyi değiştirebilirsin ki? Ben muhtemelen değiştirmek için ne ister?

Ve eğer Microsoft beni mi yoksa son olarak, List neden sınıf yapmak değildi devralır sealed?

Başka ne yapmam gerekiyor ki?

Görünüşe göre, özel koleksiyonlar için, Microsoft List yerine genişletilmiş olmalıdır Collection sınıf sağlamıştır. Ama bu sınıf çok çıplak ve çok yararlı şeyler var değildir such as AddRange mesela. jvitor83's answer sağlayan özel yöntem performans için bir gerekçe, ama nasıl bir AddRange AddRange hayır daha iyi değil yavaş?

Collection miras List, devralmasını daha çok iş var ve hiçbir fayda görüyorum. Kesinlikle Microsoft bana söylemiyordu için ekstra çalışma için bir sebep yok, o yüzden yardımcı olamam gibi hissediyorum Ben bir şekilde yanlış bir şey, ve devralma Collection aslında doğru çözüm için benim sorunum.

IList uygulanması gibi öneriler gördüm. Sadece hayır. Bu bana hiçbir şey kazanmaz. demirbaş kod satırları onlarca.

Son olarak, bazı List kaydırma bir şeye işaret ediyor:

class FootballTeam 
{ 
    public List<FootballPlayer> Players; 
}

Bu iki sorunu vardır:

  1. Benim kod gereksiz yere ayrıntılı yapar. Şimdi sadece 28 ** yerine my_team.Players.Count aramalıyım. Neyse ki, C# ile dizin oluşturucu dizin şeffaf ve dahili tüm yöntemleri ve ilerleyin tanımlayabilir List... Ama bu kod bir sürü var! Ben tüm bu iş için ne alabilirim?

  2. Bu sadece düz mantıklı değil. Bir futbol takımı "" oyuncu listesi yok.oyuncuların listesi. Söyleme "John McFootballer SomeTeam oyuncular katıldı". "John SomeTeam katıldı". Bir mektup eklemeyeceksin "bir dize karakterleri", bir dize için bir mektup ekleyin. Bir kütüphane kitap için bir kitap eklemek değilsin, bir kütüphane için bir kitap ekleyin.

Farkındayım ne olur "under the hood" olduğu söylenebilir "ekleyerek X Y iç liste" ama bu gibi bir çok mantıksız şekilde düşünüyor dünya.

Benim sorum (özetlenmiş)

Nedir doğru C# şekilde temsil eden bir veri yapısı olan, "mantıklı" (yani, "insan aklı") sadece list things ile bir kaç çan ve ıslık?

List<T> devralmasını her zaman kabul edilemez? Ne zaman kabul edilebilir? Neden/neden olmasın? Bir programcı için karar vermeden List<T> miras zaman düşünmek için ne yapmalıyız?

CEVAP
11 ŞUBAT 2014, Salı


Bazı iyi cevaplar var. Onları aşağıdaki hususları eklemek istiyorum.

Nedir doğru C# şekilde temsil eden bir veri yapısı olan, "mantıklı" (yani, "insan aklı") sadece bir liste ile bir kaç çan ve ıslık?

Futbol aşina boş doldurmak için bir on non-bilgisayar programcısı insanlar soruyor:

A football team is a particular kind of _____

Yaptıherkes"birkaç çan ve ıslık ile futbolcular listesi" dediler "" veya "" veya""? organizasyon kulübü spor takımı demek Düşünceniz bir futbol takımı olduğunuoyuncu listesi belli bir türinsan aklını ve insan aklının tek başına.

List<T>mekanizması. Futbol takımınıniş nesnesiyani, bir nesnenin içinde olan bazı kavram temsil ederiş alanıprogramın. Yok o karışımı! Bir futbol takımıbir türtakım;bir vardırliste, bir listeoyuncu listesi. Bir liste değiloyuncu listesi belli tür. Bir listeoyuncu listesi. List<Player> bir özellik Roster denir. Ve bir futbol takımı hakkında bilgisi olan herkesin listesi oyuncular silmek için alır eğer inanmazsan bunu yaparken ReadOnlyList<Player>.

List<T> devralmasını her zaman kabul edilemez?

Kim için kabul edilemez? Bana? Hayır.

Ne zaman kabul edilebilir?

Bir mekanizma bir bina oluyoruzatır List<T> mekanizma.

Bir programcı için karar vermeden List<T> miras zaman düşünmek için ne yapmalıyız?

Ben bir binamekanizmasıya da biriş nesnesi?

Ama bu kod bir sürü var! Ben tüm bu iş için ne alabilirim?

List<T> ilgili üyeleri elli kat daha fazla zamanın iletme yöntemleri yazmak için almış olmalı sorunuzu yazarak geçirdin. Açıkça ayrıntı korkmuyorsun, ve kod küçük bir miktar paradan söz ediyoruz; bu bir kaç dakikalık iş.

GÜNCELLEME

Biraz daha düşündüm ve oyuncu listesi gibi bir futbol takımı model için değil başka bir nedeni var. Aslında sadece bir futbol takımı olarak model için kötü bir fikir olabilirsahipoyuncular listesini de. Takım/oyuncu listesine sahip derdin ne olduğunuanlık görüntütakımzaman içinde bir an. Bilmiyorum ne iş böyledir bu sınıf, ama eğer bir sınıfı temsil edilen bir futbol takımı istiyorum istiyorum iste bu gibi sorular "kaç Seahawks oyuncular cevapsız oyunları nedeniyle yaralanma arasında 2003 ve 2013?" veya "Ne Denver oyuncusu daha önce oynanan başka bir takım vardı en büyüğü yıldan yıllık artış metre koştu?" veya "Did the Piggers go all the way this year?"

Yani, bir futbol takımı benim için iyi modellenmiş gibi görünüyortarihi gerçekleri bir koleksiyonbir oyuncu olarak işe başladı gibi, yaralı, emekli, vb. Açıkçası kadrosu muhtemelen ön ve merkezi olması gereken önemli bir gerçektir, ama bu yapmak istediğiniz diğer ilginç şeyler olabilir geçerli oyuncu daha tarihsel bir bakış açısı gerektiren nesne.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006
  • Marina and The Diamonds

    Marina and T

    8 Temmuz 2008
  • Peter Sharp

    Peter Sharp

    11 ŞUBAT 2013