Temiz Kod ilkelerini işlevsel dillere uygulamak


17

Şu anda Robert Martin'in Temiz Kodunu okuyorum . Bence harika ve OO kodunu yazarken derslerini kalpten alıyorum. Özellikle, anlamlı isimlerle küçük fonksiyonları kullanma tavsiyesinin kod akışımı çok daha sorunsuz hale getirdiğini düşünüyorum. En iyisi bu alıntı ile özetlenir:

[W] programı, her biri geçerli soyutlama düzeyini tanımlayan ve sonraki TO paragraflarına sonraki seviyedeki aşağıya atıfta bulunan bir dizi TO paragrafıymış gibi okuyabilmek istiyor.

( Temiz Kod , sayfa 37: "TO paragrafı", mastarda sesli bir cümle ile başlayan bir paragraftır. "X için Y ve Z adımlarını gerçekleştiririz." "Y, biz ..." vb. ) Örneğin:

RenderPageWithSetupsAndTeardowns için sayfanın bir test sayfası olup olmadığını kontrol ediyoruz ve eğer öyleyse kurulumları ve gözyaşlarını ekliyoruz. Her iki durumda da sayfayı HTML biçiminde işleriz

Ayrıca işim için fonksiyonel kod yazıyorum. Martin'in kitaptaki örnekleri kesinlikle bir dizi paragrafmış gibi okuyorlar ve çok açıklar - ama "bir dizi paragraf gibi okuyor" işlev kodunun sahip olması istenen bir kalite olduğundan emin değilim .

Haskell standart kütüphanesinden bir örnek almak :

maximumBy               :: (a -> a -> Ordering) -> [a] -> a
maximumBy _ []          =  error "List.maximumBy: empty list"
maximumBy cmp xs        =  foldl1 maxBy xs
                        where
                           maxBy x y = case cmp x y of
                                       GT -> x
                                       _  -> y

Bu, Martin'in tavsiyelerinden alabileceğiniz kadar uzak, ama bu özlü, deyimsel Haskell. Kitabındaki Java örneklerinden farklı olarak, bunu istediği türden bir kadansa sahip bir şeye yeniden yansıtmanın hiçbir yolunu hayal edemiyorum. Temiz Kod standardına göre yazılan Haskell'in uzun soluklu ve doğal olmayan olarak çıkacağından şüpheleniyorum .

İşlevsel programlama için en iyi uygulamalarla Temiz Kod'u (en azından bir kısmını) dikkate almam yanlış mı? Farklı bir paradigmada söylediklerini yeniden yorumlamanın mantıklı bir yolu var mı?


1
Fonksiyonel programcılar aşırı kısa kod yazma eğilimindedir, doğrudur. Yine de, o ortamda bile en iyi uygulamayı uzaktan düşünmezdim.
Telastyn

Cehaleti affedin, ama TO paragrafı nedir?
Shashank Gupta

4
Son zamanlarda başka bir soruda belirtildiği gibi, Dijkstra "doğal dil programlama" nın aptallığı hakkında yazdı ve ben nesir gibi okunan kodun bir boru rüyası olduğu konusunda hemfikirim. Bence bu, saf olarak, efektler üretmek için adım dizileri yerine değerler arasındaki eşitlikleri sembolik olarak ifade eden Haskell için geçerli. Önemli olan alıntı kodu deyimsel olduğunu düşünüyorum. Örneğin xsbir tür kötü bir isimdir fakat işlevsel dillerde idöngü değişkenleri kadar yaygındır .
Doval

@ShashankGupta Soruyu, kitaptaki belirli sayfaya bir bağlantı ve Bob Amca'nın ne yazdığına dair kendi anlayışımla düzenledim.

@ShashankGupta Birkaç örnek veriyor, ancak fikir nesir gibi okuması gerektiğidir. "Listenin maksimum değerini bulmak için her elemanı kontrol edersiniz ..."
Patrick Collins

Yanıtlar:


11

Temiz Kod her şeyden önce bir stil kılavuzudur. Klingon'da yazarken Strunk ve White uygulanmaz. Fikir, muhtemelen kodunuzu okuyacak programcılar için açık olmak istiyorum. Modülerleştirilmiş ve yeniden yapılandırılması kolay bir koda sahip olmak istiyorsunuz. Bunu başka bir dilde yapmanın yolları olduğu gibi Haskell'de bunu yapmanın yolları vardır, ancak kesin ayrıntılar değişecektir.

Bununla birlikte, Haskell için bir dizi stil kılavuzu var. Stack Overflow'ın da oldukça kapsamlı bir kılavuzu var . Kodlama mantığını açık ve kısa tutmak oldukça sabit görünüyor. Modülerliğe yol açtığı için fonksiyonların genelleştirilmesi de vurgulanmaktadır. DRY kodu da Clean Code ile aynı şekilde vurgulanmıştır.

Sonunda, Clean Code ve Haskell'in kodlama yönergeleri aynı şey için çaba gösterir, ancak oraya ulaşmak için kendi yollarını bulmaya çalışırlar.


1
Bu cevabın, Temiz Kod'un diller arasında çok geçerli olan öğrettiği ve sorulan sorunun temelini oluşturan ilkeleri indirdiğini hissediyorum . İnsanların neden Temiz Kod'u bir stil el kitabı olarak düşündüklerini anlayabiliyorum ve bence bu kısmen doğru, ama tüm kitabı bir tane olarak reddedecek kadar doğru değil.
Allan

Martin Clean Code kitabını stil el kitabı olarak düşünmüyorum. Kitabın öğretilerinin aslında bir stil rehberi ve tasarım kalıpları arasında bir yere uyduğunu hissediyorum.
Michael R

16

Örneğinizle ne demek istediğinizi takip ettiğimden emin değilim. Paragraflar, onları tanımladığı gibi, uzun sargı gerektirmez. Kodun İngilizce gibi okunması gerektiği anlamına gelmez. Önemli olan, işlevselliğin aynı soyutlama düzeyinde, mantıksal bir ilerleme içinde gruplandırılmasıdır. Bu, programlama paradigmalarını aşan teorik bir yapısal kavramdır.

Bob Martin'in "TO paragraf" formatında ifade edilen örneğini şöyle okudum:

  • Hesaplamak için maximumBy, bir sipariş fonksiyonuna ve bir listeye ihtiyacınız vardır ve sonuç bu listenin bir öğesidir.
  • maximumByBoş bir listenin ve herhangi bir sipariş fonksiyonunun hesaplanması bir hatadır.
  • maximumByBir listeyi hesaplamak için xs, maxByişlevi kullanarak bu listenin üzerine katlanırsınız .
  • maxByİki liste öğesinden hesaplamak için , verilen sipariş işlevini kullanarak bunları karşılaştırabilirsiniz. İlk eleman daha büyükse onu seçin. Aksi takdirde ikincisini seçin.

En genel kavramlarla başlıyorsunuz ve tıpkı zorunlu örneklerde olduğu gibi daha ayrıntılı olarak ilerliyorsunuz. "TO paragrafları" fikri, yeterince ayrıntı elde ettiğinizde, sayfayı yukarı ve aşağı atlamak zorunda kalmadan belirli bir noktada okumayı durdurabilmenizdir. Kesinlikle burada durum böyle.

Birkaç isim belki daha iyi olabilir, ancak özellikle genel üst düzey işlevler yazarken, dilin ortak kurallarıdır. Üst düzey işlev adları da kitaptaki örnekler gibi zorunlu fiil cümlelerine iyi tercüme edilmez, çünkü fiiller arasındaki ilişkileri daha fazla açıklarlar.

Bunu uygulamak için "TO paragraf" yönergelerine uymayan yollar vardır. Açık tür imzayı bırakmak, üst düzey "genel bakış" cümlesini atlar. Hata işleme için, desen eşleme yerine bir if ifadesi kullanabilirsiniz; bu, bunu başka bir soyutlama düzeyiyle uygunsuz bir şekilde karıştırır. Daha maxBysonra daha ayrıntılı olarak açıklanabilecek bir ad vermek yerine anonim bir işlev olarak satır içi kullanabilirsiniz.

Aslında, böyle yapılar düşünüyorum whereaslında bir olan iyi biz İngilizce olarak nasıl ifade yakın bir şekilde daha derin detaylara bir isim vermek bunları kullanmak ve benzer a'da kapsamını sınırlamak, çünkü paragraf biçimi için uygun "paragraf" bağlamına açık bir yol.

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.