Kabul ettiğiniz konuda liberal olun… ya da değil?


45

[Feragatname: Bu soru öznel, ancak gerçeklerin ve / veya yenilgilerin desteklediği yanıtları almayı tercih ederim]

Bence herkes Postel Yasası ile özetlenen Sağlamlık İlkesini biliyor :

Gönderdiklerinizde muhafazakar olun; kabul ettiğin şeyde liberal ol.

Yaygın bir iletişim protokolünün tasarımı için bunun mantıklı olabileceğini kabul ediyorum (kolay uzamaya izin vermek amacı ile), ancak her zaman kendi tarayıcılarını sessizleştiren her tarayıcıyı HTML / CSS'ye uygulamanın tamamen başarısız olduğunu düşündüm. algılama / davranış, birden çok tarayıcıda tutarlı bir oluşturma elde etmeyi neredeyse imkansız hale getirir.

TCP protokolünün RFC'sinin "Sessiz Hata" nın aksi belirtilmediği sürece kabul edilebilir olduğunu düşündüğünü, ancak ilginç bir davranış olduğunu, ancak en azını söyleyebildiğimi fark ettim.

Düzenli olarak açılan yazılım ticareti boyunca, geliştiricileri ısırdıkları için baştan sona bu ilkenin uygulanmasının başka örnekleri de var:

  • Javascript yarı sütun ekleme
  • C (sessiz) yerleşik dönüşümler (kesilmeseydi çok kötü olmazdı ...)

ve "akıllı" davranışların uygulanmasına yardımcı olacak araçlar vardır:

Bununla birlikte, teknik olmayan kullanıcılarla ilgilenirken veya kullanıcılara hata kurtarma sürecinde yardımcı olurken bu yaklaşımın, kütüphane / sınıf arayüzlerinin tasarımına uygulandığında bazı dezavantajları olduğunu düşünüyorum:

  • algoritmanın “doğru” olduğunu tahmin edip etmediği biraz özneldir ve bu nedenle En Az Şaşkınlık İlkesine aykırı olabilir
  • Uygulamayı zorlaştırır, böylelikle böcekleri sokma şansı artar ( YAGNI ?)
  • "tahmin" rutininin herhangi bir şekilde değiştirilmesi eskiden programların bozulmasına neden olabilir, çünkü yeniden düzenleme olasılıkları neredeyse başlıyor!

Ve bu beni şu soruya yönlendirdi:

Bir arayüz tasarlarken (kütüphane, sınıf, mesaj), sağlamlık prensibine ya da değil mi?

Arayüzlerimde kapsamlı girdi onaylamaları kullanarak kendim de oldukça katı olmaya meyilliyim ve belki de çok katı olup olmadığımı merak ediyordum.


HTML ile genel veriler arasındaki fark nedir acaba? Sağlamlık ilkesi iletişim ile ilgilidir. Biri yazar - biri okur. Ağ iletişimi neden görsel veya API’den farklı? Kabul ettiğimiz şeylerde liberal olma ilkesinin , programcı olan kullanıcıların ömrünü basitleştirdiği , kod boyutunu düşürdüğü ve bu nedenle performansları artıran ve hataları ortadan kaldıran bir API örneğine sahibim . Bak stackoverflow.com/questions/18576849
Val

@Val: aslında, örneğin eşleşmiyor. “kabul ettiğin şeyde liberal olmak” sadece temel / türetilmiş bir mesele değil, bunun ötesine geçiyor ve aynı zamanda hafifçe hatalı girdileri kabul ediyor (ve yorumluyor).
Matthieu M.

Bir olayı nasıl göstermek o vakayı göstermez?
Val

Yanıtlar:


34

Belirsizlik getirmediği zaman sağlamlık derdim .

Örneğin: Virgülle ayrılmış bir listeyi ayrıştırırken, virgül öncesi / sonrasında boşluk olup olmadığının anlamı anlamsal değildir.

Bir dize kılavuzunu ayrıştırırken, yaygın biçimdeki herhangi bir sayıyı kabul etmelidir (çizgileri olan veya olmayan, kıvrımlı ayraçlar içeren veya olmayan).

Çoğu programlama dili, beyaz alan kullanımıyla sağlamdır. Özellikle her yerde kodun anlamını etkilemiyor. Boşluğun alakalı olduğu Python'da bile, bir liste veya sözlük bildiriminde bulunduğunuzda hala esnektir.

Bir şeyin çok yönlü bir şekilde yorumlanabilmesi veya bunun ne anlama geldiğinin% 100 net olmaması durumunda kesinlikle çok fazla sağlamlığın acı verici bir sonuç olabileceği, ancak belirsiz olmadan sağlamlık için çok yer olduğu konusunda kesinlikle hemfikirim.


1
Katılıyorum, çok pahalı olmadığında sağlamlığa değecek.
Matthieu M.

2
Hatta virgülle ayrılmış liste bile sorunlara neden olur: chrome ve firefox'un javascript motoru {"key": "value",}geçerli gibi görünüyor , IE bunu kabul etmiyor. JSlint ile inşa sürecimi geliştirene kadar sık ​​sık bu sorunla karşılaştım.
keppla

2
@keppla, tasarımdan ziyade uygulamada bir sorun. Javascript spesifikasyonunun yasal olup olmadığını ve IE'nin takip etmediğinden veya FF ve Chrome'un eklediği "hoş bir özellik" olup olmadığından emin değilim, ancak Python'da bunun geçerli olduğu ve uygulandığı belirtildi. Geçerli olarak belirtilirse ve çalışmazsa, hatalı bir uygulamadır. Eğer belirtilmemişse, o zaman gerçekten güvenilmemelidir (pratiklik açısından büyük bir tarayıcıda çalışmadığı halde, kullanıcıyı kontrol etmemeniz durumunda özellikte olmadığı düşünülebilir)
Davy8,

7
@ Davy8: İzleyen virgül yasadışı görünüyor ( stackoverflow.com/questions/5139205/… ). Buna güvenmek istemiyorum, demek istediğim, yeterince insan girişi kabul ettiğinde, fiili bir standart haline geliyor (çünkü bir hata olduğunu fark etmiyor), ki bu HTML'de karşılaştığımız bir şeye yol açıyor: o kadar olağan hale gelir ki artık onları kötü girdi olarak görmezden gelemezsiniz.
keppla

1
@keppla, moz ve Chrome'da başarısız olması gerekir. Öncelikli olarak bir JS dev olarak, bana (en azından Moz'da olduğu gibi) yapmadığı için sinir ediyor. Hata ayıklamayı zorlaştırır, kolay değildir. IE ne yapması gerekiyorsa onu yapıyor. Yanlış kod @ başarısız. HTML bir şeydir. Bir kodlama dilinde bu saçmalığa ihtiyacımız yok. Bu, tarayıcı satıcılarının öne çıkardığı bir şey olan Robust ilkesinin berbat bir uygulamasının bir örneğidir.
Erik,

15

Kesinlikle hayır. Savunma programlaması gibi teknikler hataları gizlemekte , görünüşlerini daha az olası ve daha rastgele hale getirmekte ve tespit edilmelerini zorlaştırmaktadır, bu da onları izole etmeyi zorlaştırmaktadır.

Çok az derecelendirilmiş Yazma Katı Kod , böceklerin tanıtılması veya saklanması kadar zor hale getirilme ihtiyacını ve tekniklerini tekrar tekrar vurgulamak konusunda muazzamdı. "Rastgele davranışı ortadan kaldırın. Böcekleri yeniden üretmeye zorlayın" gibi ilkelerinin uygulanması yoluyla. ve "Arabirimlerinizdeki kusurları her zaman arayın ve ortadan kaldırın." geliştiriciler, çok fazla hatadan sorumlu belirsizliği ve kontrolsüz yan etkileri ortadan kaldırarak yazılımlarının kalitesini büyük ölçüde geliştirecektir.


9

Robustness'ın genel olarak kullanılması, kullanıcının ne istediğini tahmin etmenize yol açar, bu yanlış olana kadar doğru. Ayrıca, müşterilerinizin güveninizi kötüye kullanmayacağı ve sadece işe yarayacak olan rastgele saçma sapan yaratamayacağına, ancak sürüm 2'de destekleyemeyeceğinize dair tamamen yanlış yönlendirilmiş inancı gerektirir.

Doğruluk Anlaşması, müşterilerinizin küçük hata yapma hakkını reddetmenize neden olur, bu da rakiplerinin ürününde eşyalarının iyi çalıştığından şikayet edinceye kadar sorun değil ve size 5.000 sayfanızdaki kelimesiyle ne yapabileceğinizi söyler. "DRAFT", pastel boyadaki kapakta hala gözüküyor ve en az 3 uzman iddiasının temelde kusurlu olduğunu ve 200 dürüst uzman daha tam olarak anlamadığını söylüyor.

Kişisel çözümüm her zaman itiraz olmuştur. Onları destekliyorsunuz, ancak onlara yanlış yaptıklarını ve (mümkünse) düzeltmenin en kolay yolunu söyle. Bu şekilde, hata özelliğini satırın 10 yıl aşağısına kapattığınızda, en azından "sizi bunun olabileceği konusunda uyardığımızı" belirtmek için kağıt izine sahipsiniz.


İtiraz için +1 , gerçekten önemli bir kavram ve şimdiye kadar göz ardı edilmesine şaşırdım.
Matthieu M.

9

Ne yazık ki, "sağlamlık ilkesi" olarak adlandırılan, sağlamlığa yol açmamaktadır. HTML'yi örnek olarak alın. Tarayıcılar hatalı biçimlendirilmiş içeriğin anlamını tahmin etmek yerine HTML’leri baştan itibaren kesin olarak ayrıştırsa çok fazla sorun, gözyaşı, zaman ve enerji kaybı önlenebilirdi.

Tarayıcı, kapakların altında düzeltmeyi denemek yerine bir hata mesajı görüntülemiş olmalı. Bu, tüm saldırganları karışıklıklarını düzeltmeye zorlardı.


Kendimden alıntı yapma (yaşlanmalı): "ancak her zaman HTML / CSS'ye başvurusunun tamamen başarısız olduğunu düşündüm"
Matthieu M.

3
Doğru, ama aynı hata toleransı da interneti bu kadar popüler hale getirmeye yardımcı oldu.
MaR

Tarayıcı satıcıları bu konuda başarısız oldu. Doktipler ile bu konuda kendi seçimimizi yapma yeteneğimize sahibiz, ancak günün sonunda, herhangi bir doktrin bildirdiğiniz sürece, hemen hemen her şey aynı şekilde davrandı. Şimdi, başarısızlıkla nasıl başa çıkılacağı konusunda uyulması gereken aşırı karmaşık kurallar dizisinin bir çözüm olduğunu düşünüyorlar mı? Sanırım sorunu tespit edemediler.
Erik,

“Sağlam” ın zıttı olan hızlı başarısızlığın daha verimli olduğunu söylüyorsunuz.
Val

@ MaR: Öyle mi? Çok tartışmalı, çok daha büyük olasılıkla özellikleri önemliydi.
Deduplicator

6

Arabirimleri birkaç gruba bölerim (isterseniz daha fazlasını ekleyin):

  1. Kontrolünüzde olanlar katı olmalı (genellikle sınıflar)
  2. Kütüphane API'leri de katı tarafta olmalı, ancak ilave doğrulama yapılması önerilir.
  3. Her türlü suiistimalle uğraşması gereken genel arayüzler (genellikle protokoller, kullanıcı girişleri, vb.). İşte girdi sağlamlığı gerçekten karşılığını veriyor, herkesin eşyalarını düzeltmesini bekleyemezsiniz. Ve kullanıcı için, uygulamanın işe yaramazsa, bazı kötü biçimlendirilmiş saçmalıklar gönderen taraflara değil, sizin suçunuz olacağını unutmayın.

Çıktı her zaman katı olmalıdır.


5

Bence HTML ve Dünya Çapında Ağ, Robustness Principle'nin geniş çaplı gerçek dünya testini yaptı ve büyük bir başarısızlık olduğunu gösterdi. Web geliştiricileri (ve kullanıcıları) için hayatı sefil yapan ve her yeni Internet Explorer sürümünde daha da kötüye giden, rakip HTML'lerin neredeyse standartlarının karışıklığından doğrudan sorumludur.

1950'lerden bu yana kodu doğru şekilde nasıl doğrulayacağımızı biliyoruz. Sıkı bir çözümleyici aracılığıyla çalıştırın ve bir şey sözdizimsel olarak doğru değilse, bir hata atıp iptal edin. Geçmeyin, 200 $ toplamayın ve ikili olan her şeyin aşkı için, bazı bilgisayar programlarının, eğer bir hata yaparsa kodlayıcıyı okumaya çalışmasına izin vermeyin!

HTML ve JavaScript bize bu ilkeler göz ardı edildiğinde tam olarak ne olduğunu gösterdi. En iyi yol, hatalarından ders almak ve tekrar etmemek.


4
@ChaosPandion: sorun, Internet Explorer'ın kendisinde yatmadığını düşünüyorum, ancak önceki sürümlerde kabul edilen tüm standart dışı web sayfalarında ve şimdi herkesin birlikte yaşamak zorunda kaldığı ve daha az ya da daha başarılı bir şekilde uyum sağlamaya çalıştıklarını düşünüyorum.
Matthieu M.,

5
Aslında IE ekibinin tüm tarayıcı geliştiricilerin en kötü durumda olduğunu düşünüyorum. Joel düşüncelerimi oldukça iyi bir şekilde özetliyor .
Dean Harding

3
Geliştiriciler ve tasarımcılar için hayatı sefil hale getirmiş olabilir, ancak o zaman çok yavaş gelişen ve statik bir standartla sıkışıp kaldık - sanırım web'in şimdi verildiği gibi olacağından şüpheliyim. Asıl kazananlar internette gezinen ve günün sonunda sayılan insanlardı.
FinnNk

4
Ayrıca, Sağlamlık ilkesi Web Geliştiricileri için hayatı zorlaştırabilirken, Dünya Çapında Ağ'a (şu anda gezegendeki hemen hemen her büyük kurumun ayrılmaz bir parçası olan) büyük bir ARIZA demek zor .
Deworde

3
“1950'lerden bu yana kodun doğru şekilde nasıl doğrulanacağını biliyoruz. Sıkı bir çözümleyici aracılığıyla çalıştırın ve bir şey sözdizimsel olarak doğru değilse, bir hata atıp iptal edin.” Bunu gerçek bir dünya senaryosuna uygulamak için: Sayfanın en sağındaki kesimin hemen altındaki tek bir simgeyi mahvetmişsem, bütün sayfadan vazgeçmek, başka bir yere bakan birini göndermek için gerçekten iyi bir yoldur. sorun farketmezlerdi bile. Evet, yanlış yapmamam gerektiğini savunabilirsiniz. Fakat bu daha ziyade daha güçlü bir rakibinize gitmediğimden ve artık çağrılarınızı almadığım anlamına geliyor.
Deworde

3

Mason'un örneğine bir karşılama olarak, Oturum Başlatma Protokolü'ndeki deneyimim, farklı yığınların ilgili RFC'leri farklı şekilde yorumlayabilmesiydi (ve bunun şimdiye kadar yazılan her standarda da geldiğinden şüpheleniyorum ), kabul ettiğinize göre (orta derecede) liberal olmak; aslında iki cihaz arasında arama yapabilir. Bu aygıtlar, masaüstündeki yazılım parçalarının aksine olağan fiziksel şeyler olduğundan, kabul ettiğiniz konuda liberal olmanız gerekir veya telefonunuz belirli bir markadan başka bir telefonu arayamaz. Bu telefonunuzun iyi görünmesini sağlamıyor!

Ancak bir kütüphane yazıyorsanız, muhtemelen birden fazla partinin ortak bir standardı karşılıklı olarak birbiriyle uyumlu olmayan şekillerde yorumlaması probleminiz yoktur. Bu durumda, kabul ettiğiniz şeylerde katı olacağını söyleyebilirim, çünkü belirsizlikleri ortadan kaldırıyor.

Jargon Dosyası ayrıca bir kullanıcının amacını "tahmin etme" üzerine bir korku hikayesine sahiptir .


Çok eğlenceli bir hikaye :) Var olan sistemlerle etkileşime girmeye çalışırken daha fazla yere ihtiyaç duyacağınızı biliyorum, çünkü işe yaramazsa sizi suçlayacaksınız.
Matthieu M.,

Aslında, telefonunuz diğer telefonların çoğunda çalışmıyorsa, telefonunuz kötüdür .
SamB

1
@SamB: Değiştir kötü ile kırık .
Deworde

3

Haklısın, kural protokollere uygulanır ve programlanmaz. Programlama sırasında bir yazım hatası yaparsanız, derlediğiniz anda bir hata alırsınız (veya bu dinamik türlerden biriyseniz koşun). Bilgisayarın senin için tahmin etmesine izin vererek kazanılacak bir şey yok. Ortak halkın aksine, biz mühendisiz ve tam olarak ne demek istediğimi söyleyebiliyoruz. ;)

Dolayısıyla, bir API tasarlarken , Dayanıklılık İlkesini takip etmediğini söyleyebilirim . Eğer geliştirici bir hata yaparsa, derhal bunu öğrenmelidir. Tabii ki, eğer API'niz bir dosya gibi bir dış kaynaktan gelen verileri kullanıyorsa, hoşgörülü olmalısınız. Kütüphanenizin kullanıcısı, kendi hatalarını öğrenmelidir, fakat başkasının değil.

Bir kenara, TCP protokolünde "sessiz başarısızlığa" izin verildiğini tahmin ediyorum çünkü aksi takdirde, insanlar size yanlış biçimlendirilmiş paketleri atarlarsa, hata mesajlarıyla bombardıman edilirsiniz. İşte basit bir DoS koruması var.


1
“Programlama sırasında bir yazım hatası yaparsanız, derlediğiniz anda bir hata alırsınız” Size milyonlarca derleyiciyi sunuyorum UYARILAR Standart bir derleyici hala mükemmel bir şekilde yürütülebilir görevleri üretirken tükürecektir.
Deworde

1

IMO, sağlamlık bir "tercih" prensibinin değil, tasarım değişiminin bir yanıdır. Birçoğunun işaret ettiği gibi, hiçbir şey JS'nizin nerede yanlış gittiğini anlamaya çalışmak için dört saat süren hiçbir şey gibi kokmaz, sadece bir tarayıcının XHTML Strict ile doğru olanı yaptığı tek bir tarayıcıydı. Sunulan HTML'nin bir kısmı tam bir felaket olduğunda sayfanın parçalara ayrılmasını sağlar.

Öte yandan, 20 argüman alan ve atlamak isteyenler için boş veya null değerde yer tutucularla aynı sırada olmaları için ısrar eden bir yöntemin belgelerine bakmak isteyen var mı? Bu yöntemle başa çıkmak için eşit derecede sağlam bir yol, her argümanı kontrol etmek ve hangisinin göreceli konumlara ve türlere dayanarak hangisinin ne olduğunu tahmin etmeye çalışmak ve sonra sessizce başarısız olmak veya anlamsız hatalarla "yapmaya" çalışmaktır.

Veya bir nesne değişmez / sözlük / anahtar / değer çifti listesini geçirerek sürece esneklik ekleyebilir ve elde ettiğiniz her bir argümanın varlığını işleyebilirsiniz. Çok küçük perf tradeoff için, bu bir pasta ve çok senaryo yemek.

Akıllı ve arabirim tutarlı şekillerde aşırı yüklenme sorunları, işler için sağlam olmanın akıllı bir yoludur. Dolayısıyla, artık paket tesliminin düzenli olarak, yeni ortaya çıkan bir teknoloji alanındaki herkes tarafından sahip olunan ve yönetilen kitlesel olarak karmaşık bir ağda, iletim için çok çeşitli potansiyel araçlarla teslim edilemeyeceği varsayılan bir sistem haline getirilmesidir.

Bununla birlikte, özellikle de kontrol ettiğiniz bir sistem içinde, abject başarısızlığını tolere etmek asla iyi bir tradeoff değildir. Örneğin, JS'yi sayfanın başına ya da altına koymakla ilgili başka bir soruya uymamak için biraz soluklanmak zorunda kaldım. Birkaç kişi JS'yi en üste koymanın daha iyi olacağını vurguladı, çünkü o zaman sayfa tamamen yüklenemezse, potansiyel olarak bazı işlevleriniz olacaktır. Yarı çalışan sayfalar, tam veri yollarından daha kötüdür. En iyi ihtimalle, siteyi ziyaret etmeden önce yetersiz kaldığını ve kendi onaylama kontrolünü geçememesi durumunda otomatik bir e-posta ile takip etmekte başarısız olduktan sonra bir hata sayfasına yönlendirildiğinden çok daha fazla ziyaretçiyle sonuçlanırlar. Bu konuda bir şeyler yapabilecek biri.

Daha düşük bir teknoloji sayfasını alabileceğiniz bir 1999 tarayıcıda 2010 işlevselliği sunmaya çalışmak, bir aptal tasarım tradeoffunun bir başka örneğidir. Örneğin fırlatılan geçici çözümlere harcanan geliştiricilere harcadığım fırsatlar ile harcadığım para kazanma fırsatını boşa harcadım, örneğin! Ve ne için? Kanıtlanmış teknolara kötü performans gösteren daha yüksek teknoloji sayfalarını sunarken, ileri seviye tarayıcılarda seçeneklerinizi sınırlandırın.

Doğru seçim olması için, girdiyi sağlam bir şekilde ele alma seçeneği, sorunun kısa ve uzun vadede IMO'da her zaman hayatı kolaylaştırır.


4
"20 argüman alan bir yöntem için"> daha fazla incelemeye gerek yok, 5 / 6'dan sonra yöntem yanlış . Cevabınız için teşekkürler :)
Matthieu M.

1

Sessizce asla başarısız olma . Bunun dışında, bir API / kütüphane kullanıcısının ne istediğini tahmin etmeye çalışmak kötü bir fikir gibi görünmüyor. Yine de takip etmem; Sıkı bir gereksinime sahip olmakla, çağıran koddaki hataları ve / veya API’niz / kütüphaneniz ile ilgili yanlış yorumlarınızı açığa çıkarabilirsiniz.

Ayrıca, daha önce de belirtildiği gibi, kullanıcının ne beklediğini tahmin etmenin ne kadar zor olduğuna bağlıdır. Çok kolaysa, iki vakanız var:

  1. Kütüphaneniz biraz farklı şekilde tasarlanmalıdır (bazı işlevleri yeniden adlandırın ya da ikiye bölerek), böylece kullanıcı gerçekte sağladığınız şeyi bekleyebilir.
  2. Kütüphanenizin uygun şekilde tasarlandığına inanıyorsanız, açık / anlaşılır adlandırma anlamına gelir, o zaman kullanıcının istediğini çıkarmaya çalışabilirsiniz.

Herhangi bir durumda% 100 açık ve belirleyici olmamakla birlikte, bir girişin bir başkasına dönüştürülmesi gerekir, daha önce belirtilen nedenlerle (yeniden yapılanmaya uyumsuzluk, en az kullanıcı şaşkınlığı) dönüşümleri yapmamalısınız.

Bir son kullanıcı ile uğraşırken, girdi / tahminlerini düzeltmeye çalışmak çok açıktır. O edilir beklenen geçersiz bilgi girmek için; bu dava tamamen istisnai bir durum değildir. Başka bir geliştirici olsa da, basit bir teknik olmayan kullanıcı değildir. Bir hatayı anlama konusunda uzmanlığı vardır ve hatanın önemi / yararı olabilir. Bu nedenle, katı API'ler tasarlama konusunda sizinle aynı fikirdeyim, buna karşın elbette netliğe açıklık ve sadelik eşlik ediyor.

Bu soruyu benim de benzer bir durumda okumanızı tavsiye ederim .

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.