Parametre adını yansıtan: C # lambda ifadelerinin kötüye kullanılması veya Sözdizimi parlaklığı?


428

MvcContrib Grid bileşenine bakıyorum ve Grid sözdiziminde kullanılan sözdizimsel bir hile ile hayran kaldım, ama aynı zamanda püskürttüm :

.Attributes(style => "width:100%")

Yukarıdaki sözdizimi, oluşturulan HTML'nin stil niteliğini ayarlar width:100%. Şimdi dikkat ederseniz, 'stil' hiçbir yerde belirtilmez, ifadedeki parametrenin adından çıkarılır ! Bunu kazmak zorunda kaldım ve 'büyünün' nerede olduğunu buldum:

Hash(params Func<object, TValue>[] hash)
{
    foreach (var func in hash)
    {
        Add(func.Method.GetParameters()[0].Name, func(null));
    }
}

Aslında, kod öznitelik ad-değer çiftlerinin sözlüğünü oluşturmak için resmi, derleme zamanı, parametrelerin adını kullanıyor. Ortaya çıkan sözdizimi yapısı gerçekten çok etkileyici, ama aynı zamanda çok tehlikelidir. Lambda ifadelerinin genel kullanımı, yan etki olmadan kullanılan adların değiştirilmesine izin verir . Yazan bir kitapta bir örneğini görmek collection.ForEach(book => Fire.Burn(book))benim kodunda yazabilirim biliyorum collection.ForEach(log => Fire.Burn(log))ve aynı şeyi ifade . Ama burada MvcContrib Grid sözdizimi ile birdenbire, değişkenlerim için seçtiğim isimlere göre aktif olarak görünen ve kararlar veren kodu buluyorum!

Peki C # 3.5 / 4.0 topluluğu ve lambda ifadeleri sevenler ile bu ortak uygulama mı? Yoksa endişelenmemem gereken hileli bir hile mi?


34
Sadece sözdizimini ayrıştırmak yerine, kodun amacına bakmaya istekli olduğunuz sürece bunun açık göründüğünü iddia ediyorum. Hangi, iyi bir kod okuyorsanız, yine de yapmanız gereken şey budur. Sözdizimi sadece bir niyet aracıdır ve bunun kod açıklamak niyetinde olduğunu iddia ediyorum.
Jamie Penney

190
Anders'e (ve tasarım ekibinin geri kalanına) ne düşündüklerini sordum. Diyelim ki sonuçlar aile dostu bir gazetede yazdırılamaz.
Eric Lippert

22
C # şu anda haritalar, özellikle işlevlere aktarılan haritalar için temiz, hafif bir sözdizimi eksik. Çeşitli dinamik diller (Ruby, Python, JavaScript, ColdFusion 9) bunun için bir miktar genişletmek için temiz, hafif bir sözdizimine sahiptir.
yfeldblum

28
Oh, bence hoş görünüyor. Haritalar için bir sözdizimine gelince, evet, yeni {{"Do", "Aer"}, {"Re", "golden sun"} ...} yapabilir ve derleyiciyi bir haritanın yapımı, tıpkı yeni gibi [] {1, 2,3} bir int dizisinin yapımını ihlal eder. Bu tür şeyleri düşünüyoruz.
Eric Lippert

17
Eric Lippert, sana büyük saygı duyuyorum, ama sanırım sen ve grup (FREAKIN'İN ÜZERİNE saygı duyduğum Anders dahil) bunu çok zorluyorlar. İtiraf ettiğiniz gibi, C #, haritalar için sıkı bir sözdiziminden yoksundur ve diğer bazı şeritlerin (Ruby gibi) harika olanları vardır. Bu adam istediği sözdizimini almanın bir yolunu buldu. Size bunu ifade etmenin benzer yolları vardır, bu da daha az dezavantajı olan sözdizimi kadar neredeyse ifade edicidir. Ancak sözdizimi ve bunu elde etmek için çok çalıştığı gerçeği, bir dil gelişimine ihtiyaç duyduğunu göstermektedir. Geçmiş performans, sizin için harika bir şey yaratacağınızı gösterir.
Charlie Flowers

Yanıtlar:


147

Bu birlikte çalışmaz. Örneğin, bu C # - F # örneğini düşünün

C #:

public class Class1
{
    public static void Foo(Func<object, string> f)
    {
        Console.WriteLine(f.Method.GetParameters()[0].Name);
    }
}

F #:

Class1.Foo(fun yadda -> "hello")

Sonuç:

"arg" yazdırılır ("yadda" değil).

Sonuç olarak, kütüphane tasarımcıları ya bu türden 'istismarlardan' kaçınmalı ya da .Net dillerinde iyi bir birlikte çalışmayı sağlamak istiyorlarsa, en azından bir 'standart' aşırı yük (örneğin, dize adını fazladan bir parametre olarak alır) sağlamalıdır.


11
Yapmazsın. Bu strateji basitçe taşınabilir değildir. (Bir örnek olarak, başka bir şekilde yardımcı olması durumunda, F #, yalnızca dönüş türünde farklılık gösteren yöntemleri aşırı yükleyebilir (tip çıkarımı bunu yapabilir). Bu, CLR'de ifade edilebilir. Ancak F #, çoğunlukla bunu yaptınız, bu API'lar C #'dan çağrılamaz.) Interop söz konusu olduğunda, 'edge' özelliklerinde her zaman hangi avantajları alıp sattığınız interop'a karşı ödünç verilir.
Brian

32
Birlikte çalışamazlığı bir şey yapmamanın bir nedeni olarak sevmiyorum. Birlikte çalışabilirlik bir gereklilikse, bunu yapın, değilse, neden endişeleniyorsunuz? Bu YAGNI IMHO.
John Farrell

15
@jfar: .NET CLR'de arazi birlikte çalışabilirliğinin yepyeni bir boyutu vardır, çünkü herhangi bir derleyicide oluşturulan derlemelerin başka herhangi bir dilden tüketilmesi gerekir .
Remus Rusanu

25
CLS uyumlu olmanız gerekmediğini kabul ediyorum, ancak bir kütüphane veya kontrol yazıyorsanız iyi bir fikir gibi görünüyor (ve bunu başlatan snippet bir ızgaradan, evet?) Aksi takdirde, sadece sınırlandırıyorsunuz kitleniz / müşteri tabanınız
JMarsch

4
Belki de: Func <object, string> ifadesini Expression << Func <object, string >> olarak değiştirmeye değer. İfadenin sağ tarafını sadece sabit olarak kısıtlarsanız, bunu yapan bir uygulamaya sahip olabilirsiniz: public static IDictionary <string, string> Hash (params İfade <Func <nesne, dize >> [] karma) {Sözlük <string, string> değerler = yeni Sözlük <string, string> (); foreach (karma içindeki var func) {değerler [func.Parameters [0] .Name] = (dize) ((ConstantExpression) func.Body) .Değer; dönüş değerleri; }
davidfowl

154

Adı nedeniyle o kadar garip buluyorum , ama lambda gereksiz olduğu için ; anonim tür kullanabilir ve daha esnek olabilir:

.Attributes(new { style = "width:100%", @class="foo", blip=123 });

Bu, ASP.NET MVC'nin çoğunda kullanılan bir modeldir (örneğin) ve başka kullanımları vardır (bir uyarı , adın arayana özgü değil sihirli bir değerse Ayende'nin düşüncelerine de dikkat edin )


4
Bunun birlikte çalışma sorunları da vardır; tüm diller anında böyle bir anonim tür oluşturmayı desteklemez.
Brian

5
Kimsenin soruyu gerçekten nasıl yanıtlamadığını seviyorum, bunun yerine insanlar "bu daha iyi" bir argüman sunuyor. : p Bu bir istismar mı değil mi?
Sam Saffron

7
Eric Lippert'in buna tepkisini görmek isterim. Çünkü ÇERÇEVE kodunda . Ve bu kadar korkunç.
Matt Hinze

26
Kod yazıldıktan sonra sorunun okunabilirlik olduğunu düşünmüyorum . Bence asıl mesele kodun öğrenilebilirliği. Fikriniz söylendiğinde ne düşüneceksiniz ? Öznitelikler (nesne obj) ? Yönteme ne geçeceğinizi bilemeyeceğiniz için belgeleri (kimsenin yapmak istemediği) okumalısınız. Bunun sorudaki örnekten daha iyi olduğunu düşünmüyorum.
NotDan

2
@Arnis - neden daha esnek: bazı lambda uygulamaları (diğer diller) ile ilgili sorunlara neden olabilen (bana alıntı yapmayan) zımni parametre adına güvenmiyor - ancak tanımlanmış özelliklere sahip normal nesneleri de kullanabilirsiniz. Örneğin HtmlAttributes, beklenen niteliklere sahip bir sınıfa (akıl için) sahip olabilir ve sadece nulldeğerleri olanları görmezden gelebilirsiniz ...
Marc Gravell

137

Sadece benim fikrimi atmak istedim (ben MvcContrib ızgara bileşeninin yazarıyım).

Bu kesinlikle dil kötüye kullanımı - hiç şüphe yok. Ancak, gerçekten sezgisel karşı düşünmek olmaz - bir çağrı baktığınızda ne olduğunu Attributes(style => "width:100%", @class => "foo")
oldukça açık olduğunu düşünüyorum (Bu kesinlikle anonim türü yaklaşım daha kötü değil). Akıllı bir bakış açısıyla, oldukça opak olduğunu kabul ediyorum.

İlgilenenler için, MvcContrib'te kullanımı hakkında bazı arka plan bilgileri ...

Bunu kişisel bir tercih olarak ızgaraya ekledim - Anonim türlerin sözlük olarak kullanılmasını sevmiyorum ("nesne" alan bir parametreye sahip olmak, Func [] parametrelerini alan kadar opaktır) ve Dictionary collection başlatıcısı oldukça ayrıntılı (Ben de bir akıcı ("stil", "display: none") birden fazla çağrı birlikte zincirlemek zorunda, ayrıntılı akıcı arayüzlerin bir hayranı değilim. Attribute ("sınıf", "foo") vb)

C #, sözlük değişmez değerleri için daha az ayrıntılı bir sözdizimine sahip olsaydı, ızgara bileşenindeki bu sözdizimini dahil etmekten rahatsız olmazdım :)

Ayrıca bu MvcContrib içinde kullanımının tamamen isteğe bağlı olduğunu belirtmek istiyorum - bu yerine bir IDictionary almak aşırı yükleri sarma uzantı yöntemleri. Bunun gibi bir yöntem sağlarsanız, örneğin diğer dillerle birlikte çalışmak için daha 'normal' bir yaklaşımı desteklemeniz önemlidir.

Ayrıca, birisi 'yansıma yükünden' bahsetti ve sadece bu yaklaşımla çok fazla yükün olmadığını belirtmek istedim - çalışma zamanı yansıması veya ifade derlemesi yok (bkz. Http://blog.bittercoder.com /PermaLink,guid,206e64d1-29ae-4362-874b-83f5b103727f.aspx ).


1
Ayrıca burada blogumda
Jeremy Skinner

4
Intellisense'de anonim nesnelerden daha az opak değildir.
Brad Wilson

22
Arayüzün isteğe bağlı genişletme yöntemleri ile eklendiğini belirtmek için +1 . C # kullanıcısı olmayan kullanıcılar (ve dilin suistimalinden rahatsız olan herkes) bunu kullanmaktan kaçınabilir.
Jørn Schou-Rode

50

tercih ederim

Attributes.Add(string name, string value);

Çok daha açık ve standart ve lambdalar kullanılarak hiçbir şey kazanılmıyor.


20
Öyle mi? sonuçta ortaya çıkan HTML'de neye benzediğine çok yakınken (üretilen gerçek html) html.Attributes.Add("style", "width:100%");kadar iyi okumaz . style = "width:100%"style => "width:100%"
Jamie Penney

6
Sözdizimleri .Attributes (id => 'foo', @class => 'bar', style => 'width: 100%') gibi numaralara izin verir. İşlev imzası değişken sayıda argüman için params sözdizimini kullanır: Attributes (params Func <object, object> [] args). Çok güçlü, ama götürdü uzunca bir süre öyle wtf anlamak için.
Remus Rusanu

27
@Jamie: C # kodunu HTML koduna benzetmeye çalışmak tasarım kararları için kötü bir neden olacaktır. Tamamen farklı amaçlar için tamamen farklı dillerdir ve aynı görünmemelidirler.
Guffa

17
İsimsiz bir nesne de "güzellik" ten ödün vermeden kullanılmış olabilir mi? .Özellikler (yeni {id = "foo", @class = "bar", stil = "genişlik:% 100"}) ??
Funka

10
@Guffa Tasarım kararları için neden kötü bir neden olsun ki? Neden aynı görünmüyorlar? Bu muhakemeyle kasten farklı görünmelidirler mi? Yanlýţýnýzý söylemiyorum, sadece amacýnýzý daha ayrıntılı bir ţekilde incelemek isteyebileceğinizi söylüyorum.
Samantha Branham

45

Rails Land'e Hoşgeldiniz :)

Neler olduğunu bildiğiniz sürece bununla ilgili yanlış bir şey yok. (Bu tür bir şeyin bir sorun olduğu iyi belgelenmediği zaman).

Rails çerçevesinin tamamı, yapılandırma üzerinde konvansiyon fikri üzerine inşa edilmiştir. İşleri belirli bir şekilde adlandırmak, kullandıkları bir sözleşmeye girmenizi sağlar ve ücretsiz olarak birçok işlevsellik elde edersiniz. Adlandırma kuralına uymak sizi daha hızlı gittiğiniz yere götürür. Her şey mükemmel çalışıyor.

Böyle bir hile gördüğüm başka bir yer, Moq'ta yöntem çağrısı iddialarında. Bir lambdadan geçersiniz, ancak lambda asla idam edilmez. İfadeyi sadece yöntem çağrısının gerçekleştiğinden emin olmak için kullanırlar ve eğer değilse bir istisna atarlar.


3
Biraz tereddüt ettim ama katılıyorum. Yansıtma yükünün yanı sıra, Add () 'de olduğu gibi bir dize kullanma ile lambda parametre adı kullanma arasında önemli bir fark yoktur. En azından aklıma gelen. Her iki yönden de fark etmeden onu emebilir ve "sytle" yazabilirsiniz.
Samantha Branham

5
Bunun benim için neden garip olmadığını anlayamadım ve sonra Rails'i hatırladım. : D
Allyn

43

Bu korkunçBirden fazla seviyede . Ve hayır, bu Ruby gibi bir şey değil. Bu C # ve .Net kötüye kullanımı.

Bunun daha basit bir şekilde nasıl yapılacağına dair birçok öneri vardı: tuples, anonim tipler, akıcı bir arayüz vb.

Onu bu kadar kötü yapan şey, kendi iyiliği için süslemenin tek yoludur:

  • Bunu VB'den çağırmanız gerektiğinde ne olur?

    .Attributes(Function(style) "width:100%")

  • Tamamen karşı sezgisel, akıllılığı, şeyleri nasıl aktaracağınızı anlamaya çok az yardım sağlayacaktır.

  • Gereksiz yere verimsiz.

  • Kimse onu nasıl koruyacağına dair bir ipucu olmayacak.

  • Niteliklere giren argümanın türü nedir, değil Func<object,string>mi? Bu niyet nasıl ortaya çıkıyor. "Lütfen nesnenin tüm değerlerini dikkate almayın" diyeceğiniz akıllı dokümantasyonunuz nedir?

Bence bu tiksinti duygusuna sahip olmak tamamen haklısın.


4
Ben söyleyebilirim - tamamen sezgisel. :)
Arnis Lapsa

4
Ruby gibi bir şey olmadığını söylüyorsun. Ancak, bir hashtable'ın anahtarlarını ve değerlerini belirtmek için Ruby'nin sözdizimi gibi çok fazla bir şey.
Charlie Flowers

3
Alfa dönüşümü altında kırılan kod! Yey!
Phil

3
@Charlie, sözdizimsel olarak benzer görünüyor, anlamsal olarak çok farklı.
Sam Saffron

39

Ben "sözdizimi parlak" kampındayım, eğer açıkça belgeliyorlarsa ve bu çılgınca havalı görünüyorsa, imo ile neredeyse hiç sorun yok!


10
Amin, kardeşim. Amin (yorumlar için min uzunluğunu karşılamak için 2. Amin gerekli :)
Charlie Flowers

Yorumunuz tek başına gerekenden çok daha fazlaydı. Ama sonra, sadece bir kez Amen yapıp yorumunuzu
yazamazsınız

37

Bunların her ikisi de. Bu lambda ifadelerinin ve sözdizimi parlaklığının kötüye kullanılmasıdır .


16
Peki bu lambda ifadelerinin parlak sözdizimsel istismarı mı? Kabul ediyorum :)
Seth Petry-Johnson

21

Bu tür bir kullanımla neredeyse hiç karşılaşmadım. Bence "uygunsuz" :)

Bu yaygın bir kullanım şekli değildir, genel sözleşmelerle tutarsızdır. Bu tür sözdiziminin elbette artıları ve eksileri vardır:

Eksileri

  • Kod sezgisel değil (olağan sözleşmeler farklıdır)
  • Kırılgan olma eğilimindedir (parametrenin yeniden adlandırılması işlevselliği bozacaktır).
  • Test etmek biraz daha zor (API'yi taklit etmek testlerde yansıma kullanımını gerektirecektir).
  • İfade yoğun bir şekilde kullanılırsa, sadece değeri değil, aynı zamanda parametreyi analiz etme ihtiyacı nedeniyle de daha yavaş olacaktır (yansıma maliyeti)

Artıları

  • Geliştirici bu sözdizimine ayarlandıktan sonra daha okunabilir.

Alt satır - genel API tasarımında daha açık bir yol seçerdim.


2
@Elisha - Artıları ve Eksileri tersine çevrildi. En azından ben bir Pro "sezgisel değil" koduna sahip olduğunu söylemiyorsun umarım. ;-)
Metro Şirin,

Bu özel durum için - lambda parametre adı ve dize parametresinin her ikisi de kırılgandır. Bu, xml ayrıştırma için dinamik kullanmak gibidir - uygundur, çünkü xml'den emin olamazsınız.
Arnis Lapsa

19

Hayır, kesinlikle yaygın bir uygulama değil. Karşı-sezgisel, sadece ne yaptığını anlamak için koda bakmanın bir yolu yok. Nasıl kullanıldığını anlamak için nasıl kullanıldığını bilmelisiniz.

Bir dizi temsilci kullanarak öznitelik sağlamak yerine, zincirleme yöntemleri daha açık ve daha iyi performans gösterecektir:

.Attribute("style", "width:100%;").Attribute("class", "test")

Bu yazı yazmak için biraz daha fazla olsa da, açık ve sezgisel.


6
Gerçekten mi? Ben baktığımda kod snippet'inin tam olarak ne olduğunu biliyordum. Çok katı olmadıkça o kadar da geniş değil. Dize birleştirme için aşırı yükleme + ile ilgili aynı argümanı verebilir ve bunun yerine her zaman bir Concat () yöntemi kullanmalıyız.
Samantha Branham

4
@Stuart: Hayır, tam olarak bilmiyordun, sadece kullanılan değerlere dayanarak tahmin ediyordun. Herkes bunu tahmin edebilir, ancak tahmin etmek kodu anlamak için iyi bir yol değildir.
Guffa

11
Kullanmanın .Attribute("style", "width:100%")bana verdiğini tahmin ediyorum style="width:100%", ama bildiğim kadarıyla bana verebilir foooooo. Farkı görmüyorum.
Samantha Branham

5
"Kullanılan değerlere dayalı tahmin" her zaman koda bakarken yaptığınız şeydir. Stream.close () çağrısıyla karşılaşırsanız, bunun bir akışı kapattığını varsayarsınız, ancak tamamen farklı bir şey de yapabilir.
Wouter Lievens

1
@Wouter: Kod okurken HER ZAMAN tahmin ediyorsanız, kod okumada büyük zorluklar yaşamalısınız ... "Kapat" adlı bir yöntemle ilgili bir çağrı görürsem, sınıfın yazarının adlandırma kurallarını bilmediğini toplayabilirim , bu yüzden yöntemin ne yaptığına dair herhangi bir şey almaktan çekinirim.
Guffa

17

Bunu bir cümle yazmak için kullanabilir miyim?

magic lambda (n): yalnızca sihirli bir dizgiyi değiştirmek için kullanılan bir lambda işlevi.


evet ... bu çok komik. ve belki de büyülü tür, derleme zamanı güvenliği açısından, bu kullanımın derleme zamanı hataları yerine çalışma zamanına neden olacağı bir yer var mı?
Maslow


16

"Korku" hakkında tüm bu ranting aşırı tepki uzun süre c # adamlar bir grup (ve ben uzun zamandır bir C # programcı ve hala dilin çok büyük bir hayranıyım). Bu sözdiziminde korkunç bir şey yok. Sadece sözdizimini daha çok ifade etmeye çalıştığınız gibi göstermeye çalışmaktır. Bir şeyin sözdiziminde ne kadar az "gürültü" varsa, programcı bunu o kadar kolay anlayabilir. Bir kod satırındaki gürültüyü azaltmak sadece biraz yardımcı olur, ancak daha fazla kodda birikmesine izin verin ve önemli bir fayda olduğu ortaya çıktı.

Bu, yazarın DSL'lerin sağladığı faydalar için çaba gösterme girişimidir - kod söylemeye çalıştığınız gibi "göründüğünde" büyülü bir yere ulaştınız. Bunun birlikte çalışma için iyi olup olmadığını veya "karmaşıklık" maliyetinin bir kısmını haklı çıkarmak için anonim yöntemlerden yeterli olup olmadığını tartışabilirsiniz. Yeterince adil ... yani projenizde bu tür sözdiziminin kullanılıp kullanılmayacağına dair doğru seçimi yapmalısınız. Ama yine de ... bu, bir programcı tarafından günün sonunda, hepimiz yapmaya çalıştığımız (bunu fark edip etmesek de) yapmaya çalışan akıllıca bir girişimdir. Ve hepimiz yapmaya çalıştığımız şey şudur: "Bilgisayara ne yapmasını istediğimizi mümkün olan en yakın dilde ne yapmasını istediğimizi anlatın."

Bilgisayarımıza talimatlarımızı dahili olarak düşündüğümüz şekilde ifade etmeye yaklaşmak, yazılımı daha sürdürülebilir ve daha doğru hale getirmenin anahtarıdır.

DÜZENLEME: "Yazılımı daha sürdürülebilir ve daha doğru hale getirmenin anahtarı" demiştim; "Anahtar" olarak değiştirdim.


12

Bu, ifade ağaçlarının faydalarından biridir - ekstra bilgi için kodun kendisini inceleyebilir. Bu .Where(e => e.Name == "Jamie")şekilde eşdeğer SQL Where yantümcesine dönüştürülebilir. Bu ifade ağaçlarının akıllıca kullanılmasıdır, ancak bundan daha ileri gitmeyeceğini umuyorum. Daha karmaşık bir şey, değiştirmeyi umduğu koddan daha zor olabilir, bu yüzden kendi kendini sınırlayacağından şüpheleniyorum.


Geçerli bir noktadır, ancak reklamcılıkta doğrudur: LINQ, bunu daha yasal bir mesele haline getiren TableAttribute ve ColumnAttribute gibi bir dizi özellik ile birlikte gelir. Ayrıca linq eşleme, bir parametre adlarından tartışmasız daha kararlı olan sınıf adlarına ve özellik adlarına bakar.
Remus Rusanu

Orada sana katılıyorum. Eric Lippert / Anders Helsberg / vs'nin konu hakkında söylediklerini okuduktan sonra bu konudaki tutumumu biraz değiştirdim. Hala biraz yardımcı olduğu için bu cevabı bırakacağımı düşündüm. Değeri için, şimdi HTML ile çalışma tarzının güzel olduğunu düşünüyorum, ancak dile uymuyor.
Jamie Penney

7

Bu ilginç bir yaklaşım. İfadenin sağ tarafını yalnızca sabit olarak kısıtladıysanız şunu kullanarak uygulayabilirsiniz:

Expression<Func<object, string>>

Hangi delege yerine gerçekten istediğinizi düşünüyorum (her iki tarafın adlarını almak için lambda kullanıyorsunuz) Aşağıdaki naif uygulamaya bakın:

public static IDictionary<string, string> Hash(params Expression<Func<object, string>>[] hash) {
    Dictionary<string, string> values = new Dictionary<string,string>();
    foreach (var func in hash) {
        values[func.Parameters[0].Name] = ((ConstantExpression)func.Body).Value.ToString();
    }
    return values;
}

Bu, daha önce iş parçacığında bahsedilen çapraz dil birlikte çalışma endişesini de giderebilir.


6

Kod çok zekidir, ancak potansiyel olarak çözdüğü daha fazla soruna neden olur.

İşaret ettiğiniz gibi, şimdi parametre adı (stil) ve bir HTML özelliği arasında belirsiz bir bağımlılık var. Derleme zamanı kontrolü yapılmaz. Parametre adı yanlış yazılırsa, sayfada muhtemelen bir çalışma zamanı hata mesajı olmaz, ancak mantık hatası bulmak çok daha zordur (hata yok, ancak yanlış davranış).

Daha iyi bir çözüm, derleme zamanında kontrol edilebilen bir veri elemanına sahip olmak olacaktır. Bunun yerine:

.Attributes(style => "width:100%");

bir Style özelliğine sahip kod derleyici tarafından kontrol edilebilir:

.Attributes.Style = "width:100%";

ya da:

.Attributes.Style.Width.Percent = 100;

Bu, kod yazarları için daha fazla iştir, ancak bu yaklaşım, C # 'ın güçlü tür kontrol yeteneğinden yararlanır, bu da hataların ilk etapta kodlara girmesini önlemeye yardımcı olur.


3
Derleme zamanı kontrolünü takdir ediyorum, ancak bunun bir görüş meselesi olduğunu düşünüyorum. Belki yeni Öznitelikler () {Style: "width: 100%"} gibi bir şey daha fazla insan kazanır, çünkü bu daha fazla aldatıcıdır. Yine de, HTML'nin izin verdiği her şeyi uygulamak büyük bir iştir ve sadece dizeleri / lambdas / anonim sınıfları kullanmak için birini suçlayamam.
Samantha Branham

5

gerçekten Ruby =) gibi görünüyor, en azından benim için daha sonra dinamik bir "arama" için statik bir kaynak kullanımı api tasarım dikkate uymuyor, umarım bu akıllı hile bu api isteğe bağlıdır.

IDictionary (veya değil) devralmak ve bir değer ayarlamak için bir anahtar eklemeniz gerekmediğinde bir php dizi gibi davranan bir dizinleyici sağlayabilir. Bu, yalnızca c # değil, .net semantiğinin geçerli bir kullanımı olacaktır ve yine de belgelere ihtiyaç duyar.

Bu yardımcı olur umarım


4

Bence bu lambdaların kötüye kullanılması.

Sözdizimi parlaklığı için style=>"width:100%"düz kafa karıştırıcı buluyorum . Özellikle =>yerine=


4

IMHO, bunu yapmanın harika bir yolu. Hepimiz bir sınıf Kontrolörü adlandırmanın MVC'de bir kontrolör yapmasını seviyoruz değil mi? Yani isimlendirmenin önemli olduğu durumlar var.

Ayrıca burada niyet çok açık. O anlamak çok kolaydır .Attribute( book => "something")sonuçlanacaktır book="something"ve.Attribute( log => "something") sonuçlanacaktırlog="something"

Bir kongre gibi davranırsanız bir sorun olmamalı sanırım. Ben daha az kod yazmak ve niyeti açık kılan ne olursa olsun iyi bir şey olduğunu düşünüyorum.


4
Bir denetleyiciyi adlandırmak, denetleyiciden de miras almazsanız
çömelmez

3

Yöntem (func) adları iyi seçilmişse, bu bakım baş ağrısından kaçınmanın mükemmel bir yoludur (yani: yeni bir işlev ekleyin, ancak işlev-parametre eşleme listesine eklemeyi unutun). Tabii ki, bunu ağır bir şekilde belgelemeniz gerekiyor ve bu sınıftaki işlevler için belgelerden parametreler için belgeleri otomatik olarak oluşturmanız daha iyi olur ...


1

Bence bu "sihirli iplerden" daha iyi değil. Ben de bunun için anonim türlerin hayranı değilim. Daha iyi ve güçlü bir şekilde yazılmış bir yaklaşıma ihtiyaç duyar.

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.