Gelecek prova kodu


33

Çalıştığım yerde geliştiriciler bana her zaman "Bunu gelecek için ekledim" ya da "Sanırım bunu yapmanın iyi bir fikir olduğunu düşünüyorum çünkü muhtemelen bir gün isteyecekler". Gelecekteki değişimleri önceden tahmin etmede proaktif olmalarının harika olduğunu düşünüyorum ama gereksiz olduğunu ve asla gerekli olmayacak kod yazmanın riskli olduğunu düşünmemize yardımcı olamıyorum, bu yüzden verimsiz (ayrıca bazı geliştiricilerin sadece bir şeyler denemek istediğini düşünüyorum) onun iyiliği için yeni). Yalnızca iyi ve temiz bir şekilde düzenlenmiş bir kod yazarsanız, ileride yapılacak provalara ilişkin argümanlar geçersiz midir?


5
Sanırım sadece geleceğe dönük kodun ... iyi boşluk olması. :)
Adam Arold

6
"Tam zamanında, sadece durumda değil".
Rein Henrichs

4
@ edem katılmıyorum, bu dilin gelecekteki provalar için diğerlerinden farklı olmadığı ... (^ _—) en.wikipedia.org/wiki/Whitespace_(programming_language)
Izkata

Yanıtlar:


62

Öncelikle, açıklığa kavuşturulması gereken bazı şeyler var:

  • Gelecek provası bir şeyler eklemek değildir .
  • Gelecekteki prova, mevcut işlevleri bozmadan kolayca kod / özellik ekleyebilmenizi sağlar.

Bu, "gelecekteki kanıt" kodunun yazılmasının, kodun gevşek bir şekilde, yeterince soyut değil, aynı zamanda soyutlama seviyelerini tamamen gizlemeyen bir kodla yazılmasını sağlaması anlamına gelir, bu nedenle her zaman daha düşük soyutlama seviyelerine gitmenin bir yolu vardır. Eğer gerekliyse.

Gelecekteki ispat kodunun yazılması başlı başına bir sanattır ve bileşen sürümleme, endişelerin ayrılması, işlevsellik katmanlaması ve soyutluğa yönelik SOLID uygulamalarıyla sıkı sıkıya bağlıdır. Gelecekteki provaların zamanın önündeki özelliklerin eklenmesiyle bir ilgisi yoktur, ancak mevcut kod / kütüphanelerin iyi tasarımıyla gelecekte özellikleri eksiz bir şekilde ekleyebilirsiniz .

Benim 2c


Bu ve @ Thorbjørn Ravn Andersen birleştirilen testlerle ilgili cevabı mükemmel bir cevap olacaktır.
Andy Lowry

2
Bunu bir çok kez gördüm, "ho bunu ekleyeceğiz çünkü bir gün ihtiyaç duyacağız", ya hiçbir zaman gelmeyecek, ya da iyi geldiğinde, gerçekten uymayan bir veri yapısına ya da program yapısına sıkışıp kalacaksınız Sonunda ortaya çıktığında gerçek ihtiyaç. Öyleyse doğru yol eski eşyaları çıkarmak ve yeniden inşa etmek olacaktır; ancak genellikle bunun gibi geleceğe yönelik bir eğilim olma eğilimi genellikle iyi olup olmadığına bakılmaksızın zaten yapılmış olan kodu atmak için güçlü bir küçümseme ile ilişkilidir. Bu tür takımlar genellikle soğan tasarımına meyilli olup, başka katmanlardaki katmanlardaki böcekleri maskelemektedir.
Newtopian

Gelecekteki prova özellikleri eklemeyebilir ama kesinlikle kod ekleyebilirsin. Bir teknik güvenlik kontrolleri eklemek ve açıkça tanımlanmamış davranışlara izin vermemektir.
edA-qa mort-ora-y

18

Uzun süre kullanılmayacak kodları yazmayın. Büyük olasılıkla o sırada ihtiyaçlarınızı karşılamayacağından (tanımı gereği henüz bilmediğiniz) faydasız olacaktır.

Kodun zarif bir şekilde kurtarılmasını veya hızlı bir şekilde kurtarılmasını sağlayan beklenmeyen sorun durumlarına karşı dayanıklı olmasını sağlayın, ancak gelecekteki olası kullanımlar için kod yazmayın.

Bunu sağlamanın iyi bir yolu, test odaklı tasarım ve geliştirme kullanmaktır. Test durumları şartname ve kullanım durumlarından türetilmiştir. Tüm kod bir test geçişi yapmalıdır. Gereksiz kodlar yazılmamalıdır. Bu şekilde yaparak, gerekli olup olmadığını belirlemek kolaydır.


+1: Geleceği tahmin etmek çok zor. Basitçe iyi tasarım kullanmak - ve onu "iyi tasarım" olarak adlandırmak - geleceği tahmin etmekten daha iyidir.
S.Lott

17

Gelecekte kodun kanıtlanması ve gelecekte ihtiyaç duyulması halinde kod yazmanın iki farklı şey olduğunu anlamak önemlidir . İlki iyi bir uygulama için çok önemlidir, daha az genellikle iyi kodlama uygulaması değildir.

  • Benim için, kodu geleceğe dair kanıtlamak, gelişen teknolojilerle etkileşime girebilecek şekilde yazıyor. Bu, kodunuzu modülerleştirmeyi içerir, böylece uygulamanızın her bir kısmı, uygulamanın dili ve teknolojisinden bir bütün olarak bağımsız olarak etkileşime girebilir. Buna güzel bir örnek, uygulamanın farklı bölümleri arasında veri iletmek için XML veya JSON kullanmak olabilir. Ancak teknoloji geliştikçe, XML ve JSON'u her zaman okuyabileceği çok muhtemeldir.

  • Yukarıdakilere benzer şekilde, uygulamanızın bir bölümünü bir SOAP veya REST API üzerinden göstermek de aynı şeyi sağlar. Hangi teknolojiler geliştiyse gelişsin, uygulamanın her bölümünü tekrar yazmana gerek kalmayacak, çünkü yeni teknolojiler eskiyle iletişim kurabilecektir.

  • Gerekirse kod yazma noktasında kodun çok az test yapması veya hiç test yapmaması muhtemel olduğu için çok tehlikeli olduğunu düşünüyorum.

Bu nedenle, elbette, gelecekteki kodların kanıtını yapın (NASA hala Fortran kullanarak uzay gemileri gönderir), ancak 'sadece durumda' kodunu yazmayın.


1
'Gelecek kanıtı' ve 'gelecek için ihtiyaç duyulması halinde' arasındaki ayrım için +1
John Shaft

2
Ses tasarımı önerileri. Bundan eksik olan tek şey, “gelecek kanıtının” sadece “makul şekilde iyi tasarlanmış” anlamına gelen anlamsız bir buzz-cümle olduğunu açık bir şekilde ifade etmesidir.
S.Lott

11

Bir üretim ortamında ne kadar süre boyunca kodun bir kodunu etkinleştirdiğinizi ve "2 yıl önce yazdığın için şükürler olsun!" Diye düşünün.

Kod kolayca değiştirilebilir / genişletilebilir olmalıdır. Hemen gerekmeyen bir kod eklemeyin, çünkü bu çok yanlış bir güvenlik hissi verir ve değişen gereksinimler dünyasında geliştirme / test kaynaklarını boşa harcar.


3
"Şükürler olsun ki bunu 2 yıl önce yazdım!" az görülür? Tecrübelerime göre bu asla olmadı, ama belki de sadece benim.
S.Lott

4
Bu çok nadir görülen bir durumdur - çünkü 2 yıl katı olmayan / 2 yıl uzakta değişiklik yapılmasını öngören kod tabanlarının gelmesi çok zordur.
Subu Sankara Subramanian

2
Aslında, epeyce "Şükürler olsun ki bunu bir yıl önce yazdım" anları yaşadım. Düşündüğümden daha zekiyim.
Şahin

1
@Falcon bu anlar üzerinde durmaya özen gösterir mi? Hangilerinin doğru olduğunu bilmek oldukça ilginç olurdu.

7

Diğer cevapların çoğu daha büyük tasarım konularını ele alıyor ya da oldukça soyut. Gelecekte ne olacağını düşünürseniz , kodu geleceğe hazırlamanıza yardımcı olacak bazı açık teknikleri tanımlayabilirsiniz .

Öncelikle gelecekte kodun bir özellik eklemeye çalışacağını veya kodunuzu başka bir yerde tekrar kullanmaya çalışacağını düşünün. Ayrıca koddaki bir özelliği düzeltmeyi deneyebilirler. Açıkçası, sadece iyi temiz kodlara sahip olmak gerekli bir başlangıç ​​noktasıdır, ancak yapılabilecek bazı özel teknikler de vardır.

Defansif Programlama : Mevcut uygulamanın gerçekten ihtiyaç duyduğu şeyin ötesinde giriş kontrolü yapın. API'leri her çağırdığınızda, girişlerinin beklediğiniz bir şey olup olmadığını kontrol ettiğinizden emin olun. Gelecekte insanlar yeni kod sürümlerini bir araya getirecekler, bu nedenle hataların ve API iadelerinin kapsamı şu anki durumdan farklı olacaktır.

Tanımsız Davranışı Ortadan Kaldır : Pek çok kod, bir şekilde gelişen bir davranışa sahiptir. Bazı girdi kombinasyonları, hiç kimsenin gerçekten istemediği ancak gerçekleşen kesin çıktıya yol açar. Şimdi kaçınılmaz olarak birileri bu davranışa güvenecek, ancak tanımlanmadığı için kimse bunu bilemeyecek. Gelecekte davranışını değiştirmeye çalışan herkes, istemeden bir şeyleri bozacaktır. Şimdi güvenlik kontrollerini kullanın ve kodun tanımsız tüm kullanımlarını kaldırmaya / engellemeye çalışın.

Otomatik Test Paketi : Ünite testlerine duyulan ihtiyaç hakkında yazılmış birimler bulabileceğinize eminim. Ancak gelecekteki provalara atıfta bulunmak suretiyle, birisinin kodu yeniden düzenlemesine izin vermede kritik bir nokta vardır. Yeniden düzenleme, temiz kodu sağlamak için gereklidir, ancak iyi bir test paketi yoksa, güvenli bir şekilde yeniden denetleyici kuramazsınız.

Yalıtım ve Ayrıştırma : Kapsülleme ve uygun modülerleştirme iyi bir tasarım ilkesidir, ancak bunun ötesine geçmeniz gerekir. Genellikle, şüpheli bir geleceği olabilecek bir kütüphane veya API veya ürün kullanmanız gerektiğini göreceksiniz. Belki de kalite kaygıları, lisans sorunları veya yazarların geliştirmeye devam etmeleri nedeniyle. Bu durumlarda, siz ve bu kod arasına bir katman koymak için ekstra zaman ayırın. İhtiyacınız olan şey için API'yi aşağı kaydırın, böylece gelecekte daha kolay bir değişim sağlamak için bağlantı çok düşüktür.


6

İyi, temiz, iyi organize edilmiş kod , değişikliklerin ve eklemelerin doğru şekilde uygulanmasını kolaylaştırması açısından geleceğe yöneliktir.


5

En iyi ihtimalle "Gelecek Kanıtı", "gevşek bağlantılı tasarım" anlamına gelir. İnsanların zamanının% 80'i "gelecek kanıtı" derken "esnek" anlamına geliyor. Bazen kulağa hoş geldiğini söylemeye çalışıyorlar. Ama en azından işe yarayan zamanında bir şeyler veriyorlar.

En kötü ihtimalle "Gelecek Kanıtı" anlamsız. Zamanın% 20'si, basitçe bir şey sunmak yerine alternatif teknolojileri araştırmakla zaman kaybetmek için bir bahane. Hiçbir şey teslim etmiyorlar (ya da teslim ettikleri şey eldeki sorun için çok karmaşık.)

İki kenar davası var.

  1. Başarısız öngörü. İnsan aslında geleceği doğru şekilde tahmin edebilir . Bu durumda, lütfen kodu geleceğe gösteren bu güçlü öngörüyü uygulayın. Daha iyisi, piyasa trendlerini tahmin etmek ve erken emekli olmak ve kodlamayı durdurmak için başarısız olan öngörüleri uygulayın.

  2. Biri geleceği "sürmek". Diğer bir deyişle, gelecekte dağıtılmaya hazır olan şeylerin yeniden yazılmasını gerektirecek yeni teknolojiler mevcut. İlk önce bu güzel gelecek olayını konuşmamak çok garip.

    "A" projesinin derhal "A" nın yeniden yazılmasına yol açacağını bilerek "A" projesini teslim etmeliyiz. Sadece bu durumda, gelecekte "A" ispatını yapabiliriz.


5

YAGNI = İhtiyacınız olmayacak .

İçgüdüleriniz doğrudur: kodları gereksizdir, bir bakım ve test yükü ekler ve somut bir iş değeri olmayan şeylere zaman harcar.

Ayrıca Bakınız: Altın Kaplama .


4

Sorunun başlığını görmezden gelmek ve "bir gün birileri isteyebileceği için bir şeyler koymak" konusunda asıl konuya dikkat çekmek ...

Cevap hayır. Asla. Bugün ihtiyacınız olmayan bir kod dikiş yazmayın. İşte nedeni:

  1. Program şimdi olması gerekenden daha karmaşık.
  2. Özelliğe asla ihtiyacınız olmayabilir, bu yüzden zamanınızı boşa harcarsınız.
  3. Gelecekte birileri bunun için sorarsa, bu özelliğin gereksinimlerinin ne olacağını bilmiyorsunuz. Bu yüzden, onu anlamak ve değiştirmek zorunda kalacaksınız.

Bence ilk nokta en önemlisi. Farklı müşteriler için genel kodla bağdaştırılmış bir sistemle çalıştıysanız veya gerek duymadığınız özelliklerle doluysa, o zaman işlevselliği korumak veya genişletmek için ne kadar zaman ve emek harcayacağınızı bilirsiniz. söyledi. Bu yüzden ne pahasına olursa olsun kaçının.

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.