Bir hesaplamayı temsil eden uzun kodun okunmasını kolaylaştırmak mümkün müdür?


9

Uzun yöntemler genellikle kötü kabul edilir, ancak kodumda bazı anlaşılması zor uzun yöntemler (50 satırdan fazla) var. İçinde tek bir ifade zaten 50 satırdan daha uzun olduğu ve okunması zor tek bir deyim, işin yapıldığı belirli bir işi yapmak için bir ORM kullanarak bir veritabanı sorgusu oluşturmak için bu yöntemleri okumayı kolaylaştırmakta sorun yaşıyorum yöntem adında açıkça belirtilmiştir. İfadenin çok uzun olmasının nedeni, birden çok sütuna katıldığı, birden çok yere uygulandığı ve gerekli bir dokümante edilmiş çıktı formatı oluşturmak için birden çok ayrı sütun seçtiği için.

Bu kadar zor okunan kodlar kötü kod olarak kabul ediliyor mu? Benzer şekilde, açıkça adlandırılmış bir yöntemle sarılmış okunması zor bir kodla sonuçlanan karmaşık bir algoritma için kod yazarsam, bu kod kötü kod mu?


Sorguyu bir şekilde parametreleştirmenin bir yolu yok mu? Bu sorgu oluşturur yöntem içinde neler olup bittiğine bağlı olarak tahmin ediyorum. Belki daha küçük parçalara ayırabilir ve okumayı kolaylaştırmak için birkaç adımda inşa edebilirsiniz.
Zalomon

ORM'niz görünümleri destekliyor mu? Bir görünüme bir (grup) birleşimini ayıklayabilir ve sonra görünümü seçebilirsiniz. Görünüm başka bir yerde kullanılmasa bile, bu büyük bir SQL ifadesinin kırılmasına yardımcı olabilir
Caleth

ORM'niz SQL benzeri bir sorgu dilini destekliyor mu? Evet ise, sorguyu kendi dosyasına taşıyabilir ve IDE sözdizimi vurgulamasını etkinleştirebilirsiniz. Uygulamanızda sorguyu dosyadan yükleyin. IDE'niz o sorgulama dilini tam olarak desteklemiyorsa, bu mükemmel olmasa bile SQL biçimlendirmesiyle birlikte alabilirsiniz. Ancak okunabilirlik, iyi bir biçimlendirme ile büyük ölçüde artırılır. Bu ayrıca sorguyu bir karalama alanına kopyalamanın ve orada değişiklikler yapmasının kolaylığına sahiptir.
SpaceTrucker

Yanıtlar:


17

Sen yazdın

Böyle okunması zor kod kötü kod olarak kabul edilir mi?

bu yüzden kesinlikle okunması gereken bir kod olduğu konusunda hemfikirsiniz ve eğer okunması zorsa, sürdürmek ve evrimleşmek zordur. Ancak, bazen 50 satırlık bir SQL ifadesi gibi bir şeyin nasıl geliştirileceği açık değildir. Kolay "çıkarma yöntemi" yeniden düzenleme işlemleri işe yaramaz ve muhtemelen kodu daha okunaklı hale getirmek için nereden başlayacağınıza dair bir fikriniz yoktur. Bu durumlar için, aşağıdakilerden birini veya tümünü deneyebilirsiniz

  • kodu, kodu temizleme konusunda sizden daha deneyimli bir başkasına gösterin. Kuruluşunuzda sorabileceğiniz biri yoksa, codereview.stackexchange komutunu deneyin

  • belirli bir sorun için google'ı deneyin. Örneğin, "uzun sql deyimini temizle" gibi şeyler iyi bir başlangıç ​​olabilir. Bu konu hakkında kaç makale bulduğunuza şaşıracaksınız ve davanız için bir braindead tarifi bulamasanız bile, bazı yeni fikirler edinebilirsiniz.

  • yerine yapamayacağınız şeyler için bir gerekçe sorma, sen şeylere odaklanma olabilir kodunu temizlemek için yapmanız en azından biraz daha iyi bir bazı değişkenler, doğru satır sonları, doğru girinti ekleyerek bazı açıklayan yorum ekleme, vermek gibi adlandırın. Bu işlem sırasında kendinizi kodun ayrıntılarını tekrar okumaya zorlamak olası değildir, kodu daha küçük birimlere yeniden yansıtmanın bir yolunu bulursunuz

  • uygulama, uygulama, uygulama. "Temiz kodlama" bir günde öğrendiğiniz bir şey değildir, daha fazla deneyimle kolaylaşır. Belki bugün probleminiz için bir çözüm bulamazsınız, ancak birkaç ay içinde koda geri döndüğünüzde, size farklı görünecektir.


Yorum kısmı ile biraz aynı fikirde değilim, aksi takdirde olamaz ve karmaşık basit bir kod parçası varsa ve basitleştirmek için bir yol bulamadı, yorum yapılıyor ne büyük bir resim vermek olası değildir. Bazı diyagram ile belgelemek çok daha iyi olurdu. Ve bu harici belgelere atıfta bulunan bir yorum bırakılmalıdır. Tabii ki bu durum istisnai olmak zorunda, çünkü dış belgelerin nadiren yapıldığını biliyoruz, bu yüzden daha az, daha iyi. Geri kalanı için, her zamanki gibi iyi bir cevap.
Walfrat

@Walfrat: Amacım süreç hakkında genel bir rehberlik sağlamaktı, sadece "50 SQL kod satırı" için değil, tüm potansiyel yaklaşımlarla "kutudan çıkma" çözümü olarak değil.
Doc Brown

Biliyorum, sadece birkaç kez gözden geçirildikten sonra bir şey yeterince basitleştirilemezse (ne olursa olsun), yorumların muhtemelen bu şeyi karmaşık hale getirme konusunda yardımcı olmayacağını, bu nedenle minimal bir harici dokümantasyonun gerekli olacağını önermek istedim. Veritabanı sorgulamasının özel durumunda bu, sorgunun her bir bölümünün birbiriyle nasıl ilişkili olduğunu gösteren bir diyagram göstererek daha da kolaydır.
Walfrat

4

Okumak zor değil - gereksiz yere okumak zor.

Bazı şeyler sadece vardır zor. Bu durumda, sorunu tam olarak anlamanız, kodu yazmanız ve bir sonraki geliştiricinin bir şansı olması için mümkün olduğunca iyi yorumlamanız gerekir.

Ama bazı şeyler sadece zor çünkü onları zorlaştırdın. Sorun basitleştirilip daha kolay hale getirilebiliyorsa, basitleştirin. Anlaşılması zor, ancak makul olarak alt problemlere ayrılabiliyorsa, basitleştirmek için alt problemlere bölün.


Kesinlikle. Kodu kendi kendine belgelemek için elinizden gelenin en iyisini yapın, ardından boşlukları doldurmak için yorumları kullanın. (düzenlenmiş: OP'nin SQL değil ORM veritabanı sorgularına başvurduğuna dair yorumumu gönderdikten sonra farkettim.)
Kyle A

1

ORM rapor oluşturmak için? Ciddi anlamda? Biraz SQL öğrenin adamım. Yordamsal diller bu tür şeylerde korkunçtur.

SQL, karmaşık birleştirmeler ve seçimler için çok daha iyi tasarlanmış bir dildir. SQL'in güzel görünmesini sağlayamasanız bile, bir nesne üzerinde veritabanı nesnelerini sürükleyip bırakabileceğiniz ve SQL sizin için oluşturulacak her türlü görselleştirme aracı vardır. Sorgulamayı ayarlayabileceğiniz ve optimize edebileceğinizden, sorgu planını görüntüleyebildiğinizden, platformun ek dizinleme seçenekleri önerebileceği vb.

Eminim ki buradaki bazı insanlar benimle aynı fikirde değiller, ancak ORM karmaşık raporlama amaçları için uygun değil. Mümkünse bundan uzaklaşmayı ve Yapılandırılmış Sorgu Dili'ne geçmeyi düşünürüm.


2
Dürüst olmak gerekirse, ORM'leri sevmediğiniz gerçeği soru için tamamen önemsizdir.
Doc Brown

ORM'leri çok seviyorum. Kod "birden çok sütun üzerinde katılır, birden çok yerlerde uygular ve bu iş parçacığının konusu olan gerekli belgelenmiş çıktı biçimi yapmak için birden çok farklı sütun seçer" iyi bir araç olmadığını belirten.
John Wu

0

Genel olarak kod okumak zor her yerde kötü bir fikir - tek sürdürücü olsanız bile - birkaç yıl hatta haftalar sonra geri dönüp başımı döndürmek zor buluyorum.

Tek bir sorguda çok şey yapmanız gerekiyorsa, bunu gömülü yorumları olan satırlara bölmeyi deneyin:

query(join(map(condition1, condition2), blah, blah, something(bah, blah, blah))) 

Oluyor:

// Why are we doing such an awful single query rather than a sequence of selects?
query( // Description of query
  join( // Why are you doing a join here
    map( // Why a map
      condition1, // What is this
      condition2  // And this
   ), // End Map
   blah, // What, Why?
   blah, // What, Why?
   something( // What does this do?
      bah, // What, Why?
      blah, // What, Why?
      blah // What, Why?
      ) // End Something
   ) // End Join
) // End Query

Örneğiniz hakkında belirsizim. yorumlar kodun neden böyle olduğunu açıklamalıdır . Ne tanımlayıcıları tarafından ifade edilmelidir ...
Timothy truckle

@TimothyTruckle Tanımlayıcıların ne olduklarını açıkça tanımlamaları gerektiğine katılıyorum , ancak hepsi normal kodda belirsizdir - kayıt alanı adları durumunda, alan kısıtlamaları nedeniyle karşılaştığım tarihsel kısıtlamalar nedeniyle genellikle netlik eksikliği vardır. tümü büyük harf ASCII harfleri olmak üzere 5 karakterle sınırlıydı ve uyumluluk gereksinimleri nedeniyle değiştirilemedi, örneğin MD'lerin favori raporlama aracıyla.
Steve Barnes

0

@ DocBrown'un mükemmel cevabına ek olarak, hiç kimsenin her zaman "iyi" kod yazmadığını fark etmeye değer. Kodlama değiş tokuş yapar ve genellikle istediğinizden biraz daha az temiz bir şey yazdığınızı ve daha sonra geri döndüğünüzü kabul etmek daha iyidir. Yeniden düzenleme, kodu zaman içinde geliştirme sürecidir - ve tecrübelerime göre, "ilk kez doğru olsun" değil, iyi bir kod tabanı yapan şey budur.

Ve kodu, bireysel yöntemler / kod satırları düzeyinde değil, uygulama düzeyinde değerlendirirsiniz. Karmaşık bir yöntem varsa, ancak açıkça adlandırılmış, yöntem tutarlı olduğu sürece "kötü" kodu olduğunu sanmıyorum.

Adlandırma, kodu anlaşılır hale getirmek için sahip olduğunuz en büyük silahtır - yönteminize, kodunuzu okuyan kişilerin ihtiyaç duymaları halinde vücudu atlamasını sağlayan bir ad verin. Değişkenlerinizi, vb. Okuyucuların atama ifadelerini okumak zorunda kalmadan neyi temsil ettiklerini görebilecekleri şekilde adlandırın.

Bir sonraki şey, yönteminizin gerçekten tek bir şey yaptığından emin olmaktır - yan etkiler kodun anlaşılmasını zorlaştırır. Bu nedenle, yönteminiz bir çıktı biçimi için veri döndürürse, veritabanınızın durumunu "yazdırılmış" veya başka bir şekilde güncellememelidir.

Katmanlama / bileşenleştirme, yapabileceğiniz bir sonraki şeydir - ORM sonuçları üreten bir dizi karmaşık yönteminiz varsa, bunları bir araya toplayın, böylece kodunuzun okuyucuları aynı şekilde davrandıklarını, yan etkilerin olmadığını varsayabilir.

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.