Bilişsel yükü azaltmak için kodun ardındaki amaç “aptalca” mıdır?


22

Birine kodu yazma şeklinin anlaşılmasını zorlaştırdığını ve yeniden düzenlerseniz okunması daha kolay olduğunu açıklamaya çalışıyorum. Ben sürüyorum bu kod tarzı genellikle 'deyimsel' kod 'denir.

Ancak deyimsel kod ifadesi , insanların kodlama stillerini değiştirmelerini sağlamak için harika bir motivasyon olmayan ahlaki doğruluk bagajını da beraberinde getirir . Bunu söylemenin daha olumlu bir yolu , ortak stili izleyen koddur - ama sürü zihniyetinin mantığı olarak gelen eleştirel bir düşünür için.

Bu fikri, insanları kodlarını değiştirmeye motive edecek şekilde açıklamaya başladığım yol:

  • kodu okuyucunun bilişsel yükünü azaltacak şekilde yazmak (örneğin, bunun ilk türden bir vektör mü yoksa 5. türden bir tür mü olduğunu hatırlayamıyorum)
  • amacın anlaşılmasını kolaylaştıran kod (ör. bu vektör ne için?)

(Bir kenara, ilk yayınlamadan önce, Clojure The Joy of kitabının farkındayım, taslak ismi Idiomatic Clojure'du. Bu nedenle, okurlara 'neşe getirmek' için 'deyimsel' kod yapmak için bir neden gibi görünüyordu. ).

Sorum şu: bilişsel yükü azaltmak için kodun ardındaki amaç 'deyimsel' olmak mı?


Okuma koduna göre tipik yorumum, en az iki derleyici için kod yazmanızdır: Kodu kendiniz de içeren, daha sonra kodu okumak zorunda olan diğer insanlar. Ve Ant, Make veya IDE ile yaptığınız işlem. İlki daha önemli.

Yanıtlar:


19

İlk olarak, "deyimsel" teriminde herhangi bir tür "ahlaki doğruluk" olduğundan emin değilim. Düz sözlük tanımı basitçe

belirli bir dilin veya lehçenin kendine özgü veya karakteristik özelliği: deyimsel Fransızca.

Evet, deyimsel kod genellikle bilişsel ek yükü azaltır, özellikle standart kütüphanelerin ve projenin ihtiyaç duyduğu herhangi bir üçüncü taraf kütüphanenin (aslında) tüm deyimsel olduğu arabirim tanımlarında.

Bir satış noktası olarak, bilişsel ek yükü azaltmanın sizin için ne yaptığına odaklanacağım. Programcıların hataları fark etmelerini kolaylaştırır, çünkü benzersiz bir şekilde yazılmış kodları tek bir yere göre inceleyerek veya bir kenardaki durumu yanlış kullanmaya çalıştığını çözmeyi denemezler. Diğer kişilerin kodlarını incelemeyi kolaylaştırır ve bu da ekibin sözdizimi hakkında tartışmak yerine gerçek sorunları tanımlayan gerçek incelemeler yapma olasılığını artırır.

Bilişsel ek yükü azaltmanın ötesinde, deyimsel kod genellikle daha verimli bir koddur. Belli bir dilde deyimlerin çoğu gelişmektedir, çünkü dil sorunlara belirli bir şekilde yaklaşmak için tasarlanmaktadır. Kullanmakta olduğunuz derleyiciler veya tercümanlar, optimizasyonlarını deyimsel kod üzerinde yoğunlaştıracaklar. Örneğin, özyinelemenin bir kod parçasını yapılandırmanın aptalca bir yolu olduğu bir dil kullanıyorsanız, örneğin, derleyicinizin kuyruk özyinelemesi uyguladığından emin olabilirsiniz. Özyinelemenin deyimsel olmadığı bir dil kullanıyorsanız, bu daha az olasıdır. Kuyruk özyinelemenin her yerde uygulanamaması muhtemeldir, fakat çoğu derleyici yazarının sık gerçekleşmeyen şeylere odaklanmayacağı düşünülmektedir.


1
Oldukça makul cevabınız bu tepkiye ilham veriyor: Idiomatic French, Paris, Montreal, Fildişi Sahili? Kod çok farklı değil. Topluluğun olmadığı bir deyim yok. Montreal’den geliyorsanız, Paris’te biraz “bilişsel aşırı yüklenmeye” sebep olabilirsiniz. Muhtemelen dünya her zaman tek bir doğru yol olduğunu düşünenler (Python?) İle Vive la farklılığını söyleyenler arasında bölünecek! (JavaScript?). Şimdi, derleyicilerin daha verimli bulduğu Javascript deyimini yazmak istiyorsak, hepimiz bir minifier / uglifier gibi yazalım!
joshp

Neyse ki, V8 çıktığında, tasarımcılar yapay mikrobina oyunlarını daha fazla oynamayacaklarına karar verdiler ve gerçek dünyayı, iyi faktörlü, iyi tasarlanmış, deyimsel kodu ve şimdiye kadar takip eden diğer satıcıları simüle eden kriterler yarattılar. Bu, performans oyununda rolün tersine dönmesiyle sonuçlandı: derleyici yazarlarının kolay bir işi olması için performans kodunu yazması programcının işi olmadan önce derleyicileri performans için tasarlamak üzere derleyici yazarlarının işi, Böylece programcının kolay bir işi vardır - olması gerektiği gibi.
Jörg W Mittag

Güzel kırmızı ringa balığı, ancak konuşulan diller coğrafi bir sınırı paylaşıyor, bilgisayar dilleri yok. Demek istediğin biraz tartışma. Python vs JavaScript'i Parisli ve Montreal lehçeleriyle karşılaştırdığından bahsetmiyorum. (Kimin daha fazla suç alacağından emin değilim, Python Programcıları veya Montreal sakinleri?; D).
Marco

10

Deyimlerin ahlaki çağrışımları olduğu fikrini nereden aldığınızdan emin değilim. Deyimler sadece bir şeyleri ifade etmenin bir yoludur. Tek tek kelimelerden veya kelime öbeklerinden daha büyük boyutlarda kalıplardır.

Birinin kurtlarla dolması gerektiğini söyleseydim, iyi bilinen bir Alman deyimi olsa bile, ne demek istediğimi bilemezsin. OTOH, size söylemiştim, Roma’dayken Romalılar gibi yapın, ne demek istediğimi hemen anlarsınız, çünkü doğru İngilizce deyimi kullandım.

Bilgisayar dilleri farklı değil.

Aslında, programlama dünyasında "deyim" için alternatif bir isim "uygulama şekli" dir. Bu fikir, mimardan (kalıp ve harç bit ve bayt değil) Christopher Alexander'dan gelen kalıp fikri ile ilgilidir. Çoğu programcı Tasarım Desenlerini bilir, bazıları Tasarım Desenlerinden daha büyük ölçekte desen olan Mimari Desenleri bilir . Deyimler, tasarım desenlerinden daha küçük bir ölçekteki kalıplardır.


5

Çoğu dil bilerek kendilerini belli bir stile dönüştürür. Bu tarzda yazılmış kod aptalca olanıdır. Çalışma zamanı ortamı seçiminizin mevcut dil seçiminizi daraltmakta olduğu durumun ötesine bakarsanız, dilleri seçmelisiniz, çünkü eldeki sorun bir dilin belirli ifadelerinde kolayca ifade edilebilir.

Ancak çoğu insan bunu anlamıyor. Örneğin, birçok Java programcısı, JavaScript yazmak zorunda kaldıklarında (Java yazıp çapraz derlemiş olabilirler, aklınıza gelebilir) ve bir dereceye kadar başarılı olmak zorunda kaldıklarında aynı stili tutmaya çalışmaktadırlar - JavaScript'te Java-deyimsel kod yazmak - fakat her zaman JavaScript ile mücadele etme hissine sahip olacaklar. Bazı özellikleri kaçırmak veya bunları taklit etmekte zorlanmak.

Deyimsel kod iyidir. Yabancı için zor, ama öğrenebilirler. Sonuçta, kod yıllarca korunmalıdır, bu nedenle temel programın sade bir şekilde ifade edilebileceği deyimleri içinde bir dil bulabilirseniz, yapmanız gereken budur.

Sadece deyimlerin aşırı kullanımı (ya da altta yatan dil özellikleri) gibi bir şey olduğunu netleştireyim. Derleme zamanında uygulama mantığının önemli bölümlerini yürütmek için C ++ şablonları kullanıyorsanız ya da Lisp programınızın tamamı, tahmin edilemeyecek şekilde gerçek bir sorunun çözüldüğü bazı makrolara çağrı yapıyorsa, basit bir sorunun Java çözümü FizzBuzzEnterpriseEdition'ın oranları ... yanlış yapıyorsun.

İnsanlar kodun kolay okunması gerektiğini söylüyor. Bu sadece gerçeğin yarısı. Anlaşılması kolay olmalı, bu da akıl alması kolay olmasını gerektirir. Bu yeterli soyutlama kullanımını gerektirir . Çoğu şeyde olduğu gibi, doğru dengeyi sağlama meselesidir.


Keşke FizzBuzzEnterpriseEdition bağlantısı için sadece + 1 ekleyebilseydim ... :-D
cmaster - monica
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.