“Kombine” Getter / Setter VS Bireysel Yöntemlerin Avantajları Nelerdir?


12

Bu "kombine" getter / setter yöntemi (jQuery) denir:

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.text(); // myHTML now equals "This is my HTML" (Getter)
foo.text("This is a new value"); // The text now equals "This is a new value")

Bu, ayrı (teorik) yöntemlerle aynı mantıktır:

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.getText(); // myHTML now equals "This is my HTML" (Getter)
foo.setText("This is a new value"); // The text now equals "This is a new value")

Benim sorum:

JQuery gibi bir kütüphane tasarlarken, neden ikinci rotayı değil ikinci rotayı seçmeye karar veriyorsunuz? İkinci yaklaşım bir bakışta daha net ve anlaşılması kolay değil mi?


6
Martin Fowler, "aşırı yüklenmiş alıcı ayarlayıcıları" olarak adlandırdığı bir hayran değil: martinfowler.com/bliki/OverloadedGetterSetter.html
vaughandroid 11:13

1
Get / set split yöntemini sevdim (kodu daha "belirgin" hale getirdiğini düşünüyorum), ama aşırı yüklü getter / setter desen bugünlerde daha çekici buluyorum. Kodu daha temiz yapabilir. Kendimi hiçbir zaman Bay Fowler'in uzlaşmasından hoşlanmadım. Bana öyle geliyor ki her iki dünyanın da en kötüsü.
Brian Knoblauch

Martin Fowler'in buna karşı tek gerçek argümanı, 'alıcı'nın bir argümanda geçtiği zamandır, bu durumda okuyucuya bir alıcıya benzememesi nedeniyle kafa karıştırıcıdır. Şu andan itibaren, alıcının hiçbir argüman almadığı konvansiyonuna sadık kalırsanız ve ayarlayıcı bir tane alırsa, açık API yorumlarıyla birlikte jQuery / Angular yaklaşımının iyi olması gerektiği sonucuna vardım. Şimdilik.
zumalifeguard

Yanıtlar:


13

Tamamen burada spekülasyon yapıyorum, ancak jQuery'i yapılandırırken işlevsel stilin çoğunu kullanan jQuery geliştiricilerinin açıkça işlevsel paradigmaya doğru eğildiğine inanmaya meyilliyim.

Bununla birlikte, fonksiyonel paradigmada fazlalığı azaltma konusunda güçlü bir kültür vardır ve ikinci yaklaşımın gereksiz fazlalığa sahip olduğu söylenebilir. İlk yaklaşım, tüm ortak zorunluluk dillerinde kullanılan biri için açık olmayabilir, ancak iki yerine sadece bir yöntemle tartışmasız daha azıyla daha fazlasını yapıyor. Bu tehlikeli olabilir, ancak işlevsel paradigmada yaygın bir araçtır ve hızlı bir şekilde alıştığı bir şeydir.

İşlevsel paradigmada pratik yapın ve törene yönelik bu arzuyu hızla aşın ve daha azla daha fazlasını yapma yeteneğini takdir etmeyi öğrenin. Her ne kadar bu, tercihe bağlı olarak öznel bir seçim olsa da, birçok insanın boşluk yönetimi ile ilgili tercihleri ​​vardır. Bu şekilde bir yolun daha iyi olduğunu söylemiyorum, daha ziyade insanların alışkın oldukları şeyler olduklarını, bu yüzden jQuery'nin neden bu yaklaşıma sahip olduğunu söylüyorum.

Bu yüzden jQuery geliştiricilerinin bunu yaptığını ve birisinin bu yaklaşımı benimseyebileceğini düşünüyorum.


2
Kabul etti, artı JS boyutunu olabildiğince küçültme arzusunu ekledim.
Matt S

Zorunlu / ayrıntılı ve işlevsel / örtük noktalar için -1.

3
@MattFenwick Kırmak istemiyorum, işlevsel paradigmanın, zorunlu paradigmanın açıklığa doğru eğildiği, dolaylılığa doğru bir eğilimi olduğunu doğru mu söylüyorsunuz? Her ikisinin de daha iyi olduğunu söylemiyorum, sadece birinin diğerine alışılabileceğini söyleyebilirim, bu da otomatik olarak bir diğerinin aksine işleri yapmanıza neden olur (bu her iki şekilde de eşit şekilde olur)
Jimmy Hoffa

@Jimmy sorun değil; Demek istediğim, tecrübelerime göre, dolaylı / açıklığın FP / zorunlu olana dik olduğunu buldum.

@MattFenwick olabilir, ancak çok fazla kapalılık sağlayan ve HM türü sistemde yaygın olan tür çıkarımından başka bir şey söyleyebilirim, FP dillerinde yaygın olan diğer şeyler, tüm işleçler gibi, işlevinin açık bir adı yoktur, yalnızca dolaylı olarak öğrenmeniz ve bilmeniz gereken bir sembol veya DU'lar yerine üye anlamı ve konumu hakkında örtük bilgi gerektiren listelerin veya grupların ortak kullanımı (yazar monad'ın nasıl çalıştığını düşünün). Ayrıca tek harfli parametre adlarının ortaklığını görme eğilimindeyim, ancak haklı olabilirsiniz
Jimmy Hoffa

2

Form

foo.text("This is a new value"); 

bazı şeyleri ima edebilir. En yaygın olarak, bir dizeyi kabul etme fooadı verilen bir yöntemle textbir şey yapan bir nesne önerir . Bunun bir mülk olduğuna dair hiçbir ima yok.

Birçok dilde, bu kısaltılmış bir biçim olarak düşünülebilir

var result = foo.text("This is a new value"); 

sonuç atılır. Dolayısıyla bu yaklaşım, bir özellik (kod okunabilirliği açısından) ayarlamak için etkili bir yol olamayacak kadar belirsizdir.


Bu mükemmel bir nokta! Javascript okuduğumda FP gözlüklerimi taktım ve işler farklı görünüyor, bu yüzden bunu düşünmedim, ancak C #'da böyle bir kod gördüm, tam olarak sizin "" Bu yöntem ne yapıyor? ??".
Jimmy Hoffa

1

Biraz spekülatif, ama işte benim çekimim.

jQuery, javascript'in işlevsel doğasını tamamen benimser. Onu bu kadar harika yapan şey budur, ancak java gibi daha saf OO dilinden geldiklerinde bir çok geliştiricinin başlarını çizmesine izin verebilir. Tüm konvansiyonu ve iyi uygulamaları kırmış gibi görünüyor.

İşlevsel yayın, bildirici sözdizimine vurgu yapma eğilimindedir. Komutlar yerine bir gerçeğin ifadesi gibi okuma eğilimindedir. Misal

var eligible = customers.where(c => c.age > 30);

"uygun müşteri, yaşı 30'un üzerinde olan müşterilerdir" şeklinde okunabilir. Aksine, zorunlu dil bir komut dizisi gibi okunur

for (customer in customers)
    if (customer.age > 30)
        eligible.add(customer)

"Her müşteriyi kontrol edin ve yaşı 30 yaşın üzerindeyse, bunları uygun koleksiyona ekleyin" şeklinde okunabilir.

Aa setve getişlem eklemek jQuery'yi zorunlu bir kütüphane gibi hissettirir. Aşağıdaki ifadeleri okuma yöntemiyle kontrast oluşturabilirsiniz

// The element tag have an html of <p>hello</p>
$("#element").html("<p>hello</p>"); 

// content represent the html of the element tag
var content = $("#element").html();


//Imperative style

// Set the element tag to an inner html of <p>hello</p>
$("#element").setHtml("<p>hello</p>");

//Get the html of #element, and put it in the content variable
var content = $("#element").getHtml();

Eylem fiilini jQuery api'nin dışında tutarak, bildirimsel bir API gibi hissettirdiler. Kütüphaneye tutarlı, işlevsel bir his verir. Bu yüzden anahtar kelimeleri aşırı yüklediklerini düşünüyorum.


1

Bu daha fazla gibi biraz davranmaya yapar özelliklerine özellikle yardım soyut uzak tarayıcı uyumsuzlukları içindir jQuery gibi kütüphanelerde, ancak son zamanlarda JavaScript tanıtıldı ve bu nedenle yaygın olarak henüz kullanılmamaktadır.

Daha önce bu tür özelliklerle dolu bir sınıf tanımına bakarsanız, "set" ve "get" önekleri gereksiz görünür, çünkü value parametresinin eklenmesi size bunun bir ayarlayıcı olduğunu söyler. Martin Fowler , bir parametre gerektiren alıcılar hakkında iyi bir noktaya işaret eder, ancak o zaman bile, bu bağlamda ek değer parametresi, bir ayarlayıcının yanı sıra bir ayarlayıcının nadiren bir görevin sağ tarafında göründüğünü gösterir. Ve olduğunuzda yazma , yine kütüphanede belgelerine bakmak için kodu var.

Sadece avantajlar istediğinden, dezavantajları karşılamayacağım.

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.