Kod ve verilerin ayrılması nasıl pratik hale geldi?


29

Lütfen soruyu dikkatlice okuyunuz: nasıl olduğunu değil nedenini sorar .

Yakın zamanda bu cevaba rastladım , ki bu değişken veriyi saklamak için bir veritabanı kullanmayı önerir:

Tanımladığınız sihirli sayıların birçoğuna benziyor - özellikle kısmen bağımlıysa - gerçekten kod, kod değil. [...] Bir SQL tipi veritabanı anlamına gelebilir veya yalnızca biçimlendirilmiş bir metin dosyası anlamına gelebilir.

Verileri var ise programınız ne, ardından do gereken şey koymak için bir parçası olduğunu bana görünüyor programda . Örneğin, eğer programınızın işlevi ünlüleri saymaksa, içinde olmanın nesi yanlış vowels = "aeiou"? Sonuçta, çoğu dil, tam olarak bu kullanım için tasarlanmış veri yapılarına sahiptir . Yukarıda önerildiği gibi, verileri "biçimlendirilmiş bir metin dosyasına" koyarak neden ayırmak istiyorsunuz ? Neden bu metin dosyasını sadece seçtiğiniz programlama dilinde formatlamıyorsunuz? Şimdi bir veritabanı mı? Yoksa kod mu?

Bazılarının bunun aptalca bir soru olduğunu düşüneceğinden eminim, ama ciddiyetle soruyorum. "Ayrı kod ve veriler" kültürel olarak ortaya çıkıyor gibi hissediyorum; "değişkenlerinize yanıltıcı isimler vermeyin" ve "sadece dilinizi düşündüğü için boşluk kullanmayın." önemsiz ".

Örneğin, bu makaleyi ele alalım: Verileri Kukla Kodundan Ayırma Problemi . Sorun mu? Ne sorunu Eğer Kukla benim altyapısını tarif eden bir dildir, neden aynı zamanda nameserver 8.8.8.8 olduğunu tarif edemez? Bana göre problem, kod ve verilerin karışması değil, 1 ama Kukla'da yeterince zengin veri yapıları ve başka şeylerle bağlantı kurma yollarından yoksun görünüyor.

Bu değişimi rahatsız edici buluyorum. Nesneye yönelik programlama "keyfi zengin veri yapıları istiyoruz" dedi ve böylece veri yapılarına kod yetkileriyle donattı. Sonuç olarak enkapsülasyon ve soyutlama elde edersiniz. Hatta SQL veritabanlarında saklı yordamlar var. Verileri YAML'ye veya metin dosyalarına dizdirdiğinizde veya bir veritabanını bir tümörü koddan çıkarmış gibi sersemlettiğinizde, hepsini kaybedersiniz.

Verileri koddan ayırma uygulamasının nasıl olduğunu ve nereye gittiğini kimse açıklayabilir mi? Herhangi biri yayıncılardan yayınlardan alıntı yapabilir veya ortaya çıkmakta olan bir emir olarak “verilerden ayrı kod” gösteren ve kaynağını gösteren bazı alakalı veriler sağlayabilir mi?

1: eğer böyle bir ayrım bile yapılabilirse. Sana bakıyorum Lisp programcıları.


5
Seçtiğiniz dilde tüm html ve css'leri gömmekten çekinmeyin.
JeffO

3
Bence teklifin yazarı, sihir sayılarının gerçekten değişken olmadığı anlamına geliyor.
Pieter B

4
Ünlüleri zor şekilde kodlamanın yanlış bir tarafı yoktur. Başvurunuz yalnızca İngilizce harfleri saymak için kullanılacaksa.
Michael Paulukonis

3
Kod ve verileri ayırmanın büyük bir teknik nedeni, veriler değiştiğinde kodu yeniden derlemek zorunda kalmamaktır. Bu nedenle, kodlama dilleri için aynı derecede geçerli olup olmadığını sorgularım.
user16764

1
@MichaelPaulukonis: Ve bir veritabanına koymak sahte bir çözümdür. Hollandaca için gerekli değişiklikler? Sıfır (DB değişikliği bile değil). Fransızca / Almanca için gerekli değişiklikler? En azından ISO-8859-1 desteği. (DB'den daha fazla). Yunanca / Rusça için gerekli değişiklikler? Unicode desteği (DB'den fazla). Aslında, bu DB'nin yardım edebileceği bir dil düşünemiyorum.
MSalters

Yanıtlar:


22

Verileri koddan ayırmak için birçok iyi neden vardır ve bazı nedenleri yapmamak için. Aşağıdaki akla geliyor.

Zamanında. Veri değeri ne zaman bilinir? Kodun yazıldığı sırada, derlendiğinde, bağlandığında, serbest bırakıldığında, lisanslandığında, yapılandırıldığında, yürütmeye başladığında veya çalışırken. Örneğin, bir haftada (7) gün sayısı erken bilinmektedir, ancak USD / AUD kuru oldukça geç belli olacaktır.

Yapısı. Bu, tek bir veri zamanı tek bir değerlendirmeye göre mi ayarlanmış, yoksa miras alınmış mı yoksa daha geniş bir ürün koleksiyonunun parçası mı? YAML ve JSON gibi diller, çoklu kaynaklardan gelen değerlerin birleştirilmesini sağlar. Belki başlangıçta değişmez görünen bazı şeylere daha iyi bir konfigürasyon yöneticisinde özellikler olarak erişilebilir hale getirilebilir.

Yerellik. Tüm veri öğeleri sınırlı sayıda yerde saklanırsa, özellikle bazılarının yeni (değişmez) değerlerle değiştirilmesi gerekebilirse, bunları yönetmek çok kolaydır. Kaynak kodunu sadece veri değerlerini değiştirmek için düzenlemek, istemeden yapılan değişiklik ve hata riskini doğurur.

Kaygıların ayrılması. Algoritmaların doğru çalışması için hangi veri değerlerinin kullanılacağının dikkate alınmasından en iyi şekilde ayrılır. Algoritmaları test etmek için verilere ihtiyaç vardır, bunların bir parçası olmamalıdır. Ayrıca bkz . Http://c2.com/cgi/wiki?ZeroOneInfinityRule .

Sorunuza cevap olarak bu yeni bir şey değil. Temel ilkeler 30 yıldan fazla bir süredir değişmedi ve bu süre zarfında defalarca yazılmıştır. Konu hakkında hiçbir önemli yayını hatırlayamıyorum, çünkü genellikle tartışmalı olarak kabul edilmiyor, yeni gelenlere açıklamak için bir şeyler. Burada biraz daha var: http://c2.com/cgi/wiki?SeparationOfDataAndCode .

Kişisel deneyimim, bu ayrılmanın belirli bir yazılım parçasındaki öneminin zamanla daha az değil, daha büyük hale gelmesidir. Sabit kodlanan değerler başlık dosyalarına taşınır, derlenmiş değerler yapılandırma dosyalarına taşınır, basit değerler hiyerarşik ve yönetilen yapıların bir parçası haline gelir.

Trendlere gelince, profesyonel programcıların (10+ yıl) arasındaki tavrında herhangi bir büyük değişiklik görmedim, ancak endüstri giderek gençlerle doludur ve bilinip bilinip kararsız kalmaya karar verdiğimi düşündüğüm birçok şey, bazen yeni değil içgörüler ama bazen cehaletten.


2
Bu uygulamanın tarihini ve eğilimini genişletebilir misiniz? Herkes bu düşünceleri verdiyse soruyu sormazdım. Sorunun önceliği, insanların verilerinin nereye gitmesi gerektiğini (derlenen sabitler, dış veritabanları, YAML ...) nereye dikkat etmeleri gerektiği konusunda dikkatlice düşünmemek; bunun yerine sadece "KOD VE VERİ KARIŞIK! HULK SMASH!" Neden veya ne zaman bu bir şey oldu?
Phil Frost

Bu benim deneyimimin bir parçası değil, o yüzden sana söyleyemem. Cevabımı birkaç para ekledim.
david.pfx

Bence “gençlerin akını” geçerli bir açıklama, ama kabul etmeye devam ediyorum çünkü bu gençlerin bazılarından fikir edinmek için fikirlerini almak istiyorum. Açıkça "ayrı kod ve veri" kısmını aldılar, ama gerisini aldıklarını sanmıyorum. Bir blog yazısında okudular mı? Kitap? Nerede ve ne zaman?
Phil Frost

Her zaman "_____ BAD! HULK SMASH!" - bu doğru olduğu anlamına gelmez. Genellikle bu tür şeyler (örneğin, “GOTO” KÖTÜ! HULK SMASH! ”) Yeni başlayanlara, nedenini veya istisnaların ne olduğunu öğretmeden öğretilir.
AMADANON Inc.

Localityaynı zamanda tersine de çalışır: Farklı müşteriler için özel gereksinimler nedeniyle bir dizi eklenti tipi sistemle sonuçlandık ve birkaç yıl süren deneme-yanılma ile sabitlerini (hatta listeleme listeleri) Veritabanının kodunda ve Her ikisi de onu "eklenti" dışında bir yerde kullanmak yanlış olduğundan ve değişiklikler gerçekleştiğinde değişiklikler otomatik olarak sürümlendirildiğinden.
Izkata

8

Veriler çok daha iyi ölçeklenir ve koddan ayrıldığında çok daha kolay bir şekilde sorgulanabilir ve değiştirilebilir. Verileriniz doğada kodlanmış olsa bile - örneğin, verileriniz kuralları veya komutları temsil eder - bu kodu yapılandırılmış veriler olarak saklayabilirseniz, ayrı olarak saklamanın avantajlarından yararlanabilirsiniz:

izinler

Veriler kodlanmışsa, bu verileri düzenlemek için kaynak dosyayı düzenlemeniz gerekir. Bu da demek oluyor ki:

  • Yalnızca geliştiriciler verileri düzenleyebilir. Bu kötü - veri girişi geliştiricinin beceri ve bilgi gerektiren bir şey değildir.

  • Geliştiriciler olmayan kaynak dosyayı düzenleyebilir. Bu kötü - kaynak dosyayı bile bilmeden becerebilirler!

  • Veriler ayrı kaynak dosyalara kodlanmıştır ve geliştiricilerin yalnızca bu dosyalara erişimi yoktur. Ancak bu gerçekten sayılmaz - şimdi veriler koddan ayrılır ve kendi dosyalarında saklanır ...

kurgu

Bu nedenle, verileri kimin düzenleyebileceği ile ilgili olarak , ayrı ayrı depolamak en iyisidir. Peki nasıl onlar verileri düzenlemek edeceğiz? Çok fazla veriye sahipseniz, elle yazmak sıkıcı ve hataya elverişlidir. Bunun için bir kullanıcı arayüzü olması çok daha iyi! Yine de her şeyi yazmanız gerekse bile, biçimin kazan plakasını yazmak zorunda kalmayacaksınız, bu nedenle biçimi bozmanız ve tüm dosyayı bozmanız için daha az şansınız var!

Veriler kodlanmışsa, kullanıcı arayüzünü oluşturmak, otomatik bir aracın size elle yazılmış kaynak dosyaları düzenleyeceği anlamına gelir. İçeri girmesine izin verin - otomatik bir araç kaynak dosyalarınızı açar, verilerin nerede olacağını bulmaya çalışır ve bu kodu değiştirir. Brrr ... Microsoft bu şeylerden kaçınmak için C # 'ya kısmi sınıflar getirdi ...

Veriler ayrıysa, otomatik aracınızın sadece veri dosyalarını düzenlemesi gerekir. Veri programlarını düzenleyen bilgisayar programlarının bugünlerde pek yaygın olmadığına inanıyorum ...

ölçekleme

Kod ve veri çok farklı ölçeklenir. Kodunuz büyüdükçe, onu daha fazla sınıfa ve yönteme (veya veri yapıları ve işlevleri) ayırmak istiyorsunuz, ancak verileriniz - ne kadar büyürse büyüyün - tek bir yerde saklamak istiyorsunuz. Birden fazla dosyaya ayırmanız gerekse bile, bu dosyaları bir şekilde birlikte paketlemek istiyorsunuz, bu nedenle bu verilere koddan erişmek daha kolay olacaktır.

Öyleyse, bir kaynak dosya içinde binlerce satır veri bulunduğunu hayal edin. Derleyici / yorumlayıcı, dosyayı okuduğu her seferde tüm bu verileri gözden geçirmeli ve pahalı sözcü ve ayrıştırıcı ile ayrıştırmalıdır - bu verilere programın bu özel çalışmasında erişemezseniz bile. Ayrıca, bu dosyadaki gerçek kodu düzenlediğinizde, tüm süreci zorlaştıran verilere bakmanız gerekir. Ayrıca, veri dosyaları endekslenebilir. Sabit kodlanmış veriler? Çok değil...

aramak

Tonlarca veriye sahipsiniz - araştırmak isteyebileceğiniz tek şey doğal.

  • Bir veritabanında saklarsanız - veritabanı sorgu dilini kullanabilirsiniz.

  • Bir XML dosyasında saklarsanız - XPath kullanabilirsiniz.

  • JSON / YAML'da saklarsanız - en sevdiğiniz kodlama dilinin REPL'sine yükleyebilir ve arayabilirsiniz.

  • Düz eski metin dosyasında saklasanız bile, programınızın tanıyabileceği bir yapıya sahip olduğundan, arama yapmak için grep / sed / awk komutunu kullanabilirsiniz.

Kaynak dosyada kodlanmış verilerde grep / sed / awk seçeneğinin de bulunabileceği doğru olsa da, sorgunuz diğer, ilişkili olmayan satırlarla eşleşebildiğinden veya farklı şekilde yazılmış satırları özleyebildiğinden de işe yaramaz. programlama dilinin veri gösterimi sözdizimi buna izin verir.

Kodda arama yapmak için araçlar vardır, ancak kodlanmış verileri değil, bildirimleri bulmak için iyidirler.

Söyleniyor ki...

Veri ve kod arasında ayrım yapmak çok önemlidir. Sadece bir şeyin kod olarak yazılması, bunun veri olamayacağı anlamına gelmez. Ve sadece bir şeyin veri temsiliyle yazılmış olması, aslında kod olmadığı anlamına gelmez.

"Sihirli sayılar" hakkında çok katı kurallarımız olduğunda sınıftaydım - kodumuzda hiç sayı olamazdı. Bu, şöyle şeyler yapmamız gerektiği anlamına gelir:

#define THE_NUMBER_ZERO 0
//....
for(int i=THE_NUMBER_ZERO;i<cout;++i){
//....

hangi aptalca saçma! Evet, 0teknik olarak "veri", ancak sadece fordöngünün geri kalan kısmı gibi kodun bir parçası ! Dolayısıyla , onu veri olarak temsil etmemize ve koddan ayırmamıza rağmen, bu, yapmamız gerektiği anlamına gelmez . Verileri kodun içinde bırakmak istediğimiz için değil, ama gerçekten bir veri olmadığı için - kodun geri kalanından daha fazlası değil, aynı zamanda sıfır olanlara da derlenir ...


7

Sanırım bazı karışıklıklar oluyor. İki şeyi birlikte karıştırıyorsunuz: "Kod ve verileri ayırma" ve "programın verilerini davranış olarak ifade etme".

Senin durumunda, gerçekte ikincisi için endişeleniyorsun ve ilkini karıştırıyorsun. Programın davranışını veri olarak ifade ettiğinizde, genişletmeyi kolaylaştırır. İle örnekte vowels = "aeiou", ardından yeni sesli harf ekleyerek bir karakter eklemek gibi basit gibidir. Bu verilere harici olarak sahipseniz, bu davranışı programı yeniden derlemek zorunda kalmadan değiştirebilirsiniz.

Ve düşündüğünüzde, OOP bu düşüncenin bir uzantısıdır. Verileri ve davranışı birlikte bağlama, programın davranışını program verilerine göre değiştirmenize olanak sağlar.


2
Çünkü doğal olarak, ünlülerin listesi değişecek.
cHao

13
@cHao i18n devreye girer girmez, öyle .
Monica,

2
i18n kafanızı kırabilir
Rory Hunter,

2
@Angew: En kısa sürede içinde i18n adımlar olarak olsa da, yine de vidalı konum . Bunun için koda ihtiyacınız var; naif çözüm, ingilizcede bile her vakayı idare edemez. ( ïBir saniye için unut ; konuşalım yve w! Hakkında konuşalım !) Listeyi bir veritabanına taşımak bunu düzeltmeyecek ve aslında zararlı - bu yanlış yapılırsa değersiz olacak karmaşıklıktır Hatta "yanlış" ın ne olduğunu bile bilmiyorsanız i18n için sıfırdan tasarlayın. Bu noktada, zaten bir ünlüler listesinin zaten onu kesmeyeceğinin farkındasınız.
cHao

1
@BenLee: Aslında biraz şaşırmam. Şu anda konuştuğumuz gibi bazı kodları değiştirmeye çalışıyorum. Ancak her şeyi veritabanına dış kaynak olarak vermek, başka türlü bir servet demekti. Bir şeyin değiştirilmesi gerekip gerekmediğini zaten bilmiyorsanız - ve daha da önemlisi, henüz nasıl değiştirilmesinin gerekli olduğunu henüz bilmiyorsanız - o zaman IMO eklemeden önce bu esnekliğe ihtiyaç duyuncaya kadar beklemek daha iyi olur. .
cHao

5

Örneğin, eğer programınızın işlevi sesli harfleri saymaksa, sesli harfle = "aeiou" ile yanlış olan ne?

Konfigürasyonu harici olarak saklamak, birçok konfigürasyonla çalışması beklenen kodun bir versiyonuna sahip olmanıza izin verir, alternatif, yazılımın sadece konfigürasyon ile farklılık gösteren birçok versiyonunu muhafaza etmektir.

Ünlüler = "aeiou" dan bahsediyorsunuz, peki ya bazen "y" istersem, tüm programı yeniden kurmak zorunda kalmalıyım? Kodu değiştirdiğim için sürümleri kolayca yükseltebilir miyim? Eğer bir hata varsa, neden oldum mu yoksa program bozuk mu?

Bu, programınızın içindeyse, programınızın, kullanıcıların olası yan etkileri görmek için kodu taramadan ünlülerin tanımını değiştirmelerini beklememesi anlamına gelir. Tanım harici olarak saklanırsa, programın konfigürasyonda ayarlanmış herhangi bir makul değeri kırmaması gerektiği anlamına gelir.

Verileri YAML'ye veya metin dosyalarına dizdirdiğinizde veya bir veritabanını bir tümörü koddan kaldırıyormuş gibi dilsiz veritabanlarına yerleştirdiğinizde

Bazıları bunun tam tersini görüyor, yani kod tümörünü değerli verilerinizden kaldırıyorsunuz, bakınız: Torvalds'ın iyi bir programcı hakkında yaptığı alıntı


4
Torvalds alıntı, verileri değil, veri yapılarını ifade eder.
user949300,

OP: “Nesneye yönelik programlama”, “keyfi olarak zengin veri yapıları istiyoruz” dedi ve böylece veri yapılarına kod yetkileriyle donattı. ”
FMJaguar

1
Bir sesli harfin tanımında köklü bir değişiklik yaparsanız, tüm otomatik testleri yeniden yapmanız gerekecektir. Sistemler nadiren dağıtılmış bir sistemde bir yapılandırma dosyası değiştiğinde testleri tekrar yürütme olanağına sahipse. Dolayısıyla, bu tanımların sisteme dahil edilmesi gerekir; belki aralarında seçim yapabilecekleri bir yapılandırma seçeneğine sahip iki kodlanmış set olarak.
soru

Torvalds'ın teklifi için +1. Bu düşünceye katılıyorum: kukla örneğinde, meselenin kuklanın insanların içine koymak istediği bilgiyi temsil edecek iyi bir veri yapısına sahip olmadığını düşünüyorum. Kukla geliştiricileri, veri yapılarını düzeltmek yerine, "koddaki verinin" sorun olduğunu (neden? Sorusu bu!) Ve sorunu başka bir yere taşımaktan ve ek olarak imkansız kılmaktan daha az gördüğüm hiera'yı geliştirdiler. Davranışı verilerle ilişkilendirmek.
Phil Frost

2

Liderin referans verilerini küçük tablolara koymakta ısrar ettiği bir projedeydim ve bunun aptalca olduğunu düşündüm. Ancak, kalıcılık altyapımızı ve bağlantı sistemimizi kurduğumuz için, yaptığımız diğer kalıcılık işlemlerine göre oldukça düşük bir maliyete neden oldu.

Şimdi, hala o aptal karar olduğunu düşünüyorum ve biz eğer vermedi yandan altyapıya sahip, ben sadece bunu yapmazdım.

Ancak gördüğüm lehine savların bazıları:

  • Eğer bir veritabanı zihniyetiniz varsa, referans verilerini SQL veritabanına koymak raporlama için buna katılmanıza izin verir.
  • Bir yönetici yardımcı programınız varsa veya veritabanına erişiminiz varsa, çalışma zamanında değerleri değiştirebilirsiniz. (Buna rağmen ateşle oynuyor olabilir.)

Ayrıca, bazen politika kodlama uygulamalarının önüne geçer. Örneğin, bir .xml dosyasını itmenin A-OK olduğu birkaç dükkanda çalıştım, koddaki bir satıra dokunmak için tam bir regresyon döngüsü ve belki bir yükleme testi gerekiyor. Bu yüzden proje için .xml dosyalarımın oldukça zengin olduğu bir takım vardı (ve belki -heh- bazı kodlar içeriyor olabilirdi).

Her zaman kendime soruyorum; yalnızca bir metin dosyası olsa bile, verileri koddan dışsal bir veri deposuna aktarmanın avantajlarından faydalanıp yararlanamayacağımı, ancak ilk önce bu şekilde gören insanlarla çalıştım. impuls.


3
XML düzenlemenin "tamam" olduğu, ancak aynı şeyi kodda düzenlemenin zor olduğu bir mağaza prosedürleri hakkında iyi bir yorum.
user949300,

Her şeyin veritabanında olabileceği tek bir dükkanda, ekran metinlerine kadar çalıştı. Kullanıcı arayüzü kodunun yanı sıra, veritabanında olmayan tek şey veritabanı konumu ve kimlik bilgileriydi ...
jwenting

3
bir gün birileri, "bunu talep eden X kullanıcısı için bunu yeniden yapılandırabilir miyiz" diye sorana dek her zaman aptalca geliyor ve sonuçta çok saçma görünmüyor. Lanet olsun müşteriler :)
gbjbaanb

2
... ve o gün "asla" değilse, o zaman çok aptalca bir duygu
Rob

2

Size tamamen ciddi bir karşı soru sormama izin verin: Sizce "data" ve "code" arasındaki fark nedir?

"Veri" kelimesini duyduğumda "durum" olduğunu düşünüyorum. Veriler, tanım gereği, uygulamanın kendisinin yönetmek için tasarlandığı ve bu nedenle uygulamanın derleme zamanında asla bilmediği şeydir. Mümkün değilVeriyi kodlamak , çünkü kodladığınız anda onu davranış haline getirir - veri değil.

Veri tipi uygulamaya göre değişir; Ticari bir faturalandırma sistemi müşteri ve sipariş bilgilerini bir SQL veritabanında saklayabilir ve bir vektör grafik programı geometri verilerini ve meta verileri bir ikili dosyada depolayabilir. Hem bu durumlarda hem de aradaki her şeyde, kod ve veriler arasında açık ve kırılmaz bir ayrım vardır. Veriler kullanıcıya aittir. , programlayıcıya değil , bu nedenle asla kodlanmış olamaz.

Konuştuğum gibi görünüyor, şu anki sözlüğüm için mevcut olan teknik olarak doğru olan açıklamayı kullanmak: uygulamanın çoğunluğunu geliştirmek için kullanılan birincil programlama dilinde yazılmayan program davranışını yönetme.

Sadece "veri" kelimesinden çok daha az belirsiz olan bu tanımın bile birkaç sorunu var. Örneğin, programın önemli bölümlerinin her biri farklı dillerde yazılmışsa ne olur? Şahsen yaklaşık% 50 C # ve% 50 JavaScript olan birkaç projede çalıştım. JavaScript kodu "veri" mi? Çoğu insan hayır derdi. Peki ya HTML, bu "veri" mi? Çoğu insan hala hayır derdi.

Peki ya CSS? Bu veri mi yoksa kod mu? Eğer kodun program davranışını kontrol eden bir şey olduğunu düşünürsek, CSS gerçekten kod değildir, çünkü sadece (çoğunlukla, çoğunlukla) davranışı değil görünümü etkiler. Ancak bu da gerçekten veri değil; kullanıcı ona sahip değil, uygulama bile gerçekten sahip değil. Bir UI tasarımcısı için kodun karşılığı. Bu Kodunuzu var gibi oldukça kod değil.

CSS'ye bir çeşit konfigürasyon diyebilirim, ancak daha pratik bir tanım bunun sadece alana özgü bir dilde kodlanmasıdır. . XML'inizin, YAML'nizin ve diğer "formatlanmış dosyalarınızın" sıklıkla temsil ettiği şey budur. Etki alanına özgü bir dili kullanmamızın nedeni, genel olarak konuşursak, aynı bilgiyi aynı alanda, aynı bilgiyi C veya C # veya Java gibi genel amaçlı bir programlama dilinde kodlamaktan daha özlü ve daha ifade edici olmasıdır.

Aşağıdaki formatı tanıyor musunuz?

{
    name: 'Jane Doe',
    age: 27,
    interests: ['cats', 'shoes']
}

Eminim çoğu insan yapar; öyle JSON . Ve işte JSON hakkındaki ilginç şey: JavaScript’te açıkça kod var ve diğer her dilde de açıkça biçimlendirilmiş veri. Neredeyse her bir ana programlama dilinde JSON'u "ayrıştırmak" için en az bir kütüphane bulunur.

Bir JavaScript dosyasındaki bir fonksiyonun içinde aynı sözdizimini kullanırsak, koddan başka bir şey olamaz. Ve yine de, eğer bu JSON'u alırsak, bir .jsondosyaya sokar ve bir Java uygulamasında ayrıştırırsak, aniden "veri" olur. Bu gerçekten mantıklı geliyor mu?

Ben "veri-ness" veya "yapılandırma-ness" veya "kod-ness" 'in tanımlandığı şeylere özgü olduğunu , nasıl tanımlandığını değil .

Programınızın rastgele bir parola oluşturmak için, yani 1 milyon kelimelik bir sözlüğe ihtiyacı varsa, bu şekilde kodlamak ister misiniz:

var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");

Yoksa tüm bu kelimeleri satır ayrılmış bir metin dosyasına sokup programınıza bundan okumalarını mı söylersiniz? Eğer kelime listesinin hiç değişmemesi gerçekten önemli değil, zor kodlama mı yoksa yumuşak kodlama mı (birçoğunun doğru kullanılmadığı zaman bir anti-pattern olarak kabul edilir) olup olmadığı değil. Hangi format en verimlidir ve "malzeme" ne olursa olsun, "malzeme" tanımlamasını kolaylaştırır. Kod veya veri olarak adlandırmanız oldukça önemli değil; Programınızın çalışması için gereken bilgidir ve düz dosya formatı onu yönetmenin ve sürdürmenin en kolay yoludur.

Doğru uygulamaları uyguladığınızı varsayarsak, tüm bu şeyler yine de kaynak kontrolüne giriyor, bu yüzden ona kod de diyebilirsiniz, sadece farklı ve belki de minimalist bir formatta kod. Veya buna konfigürasyon diyebilirsiniz, ancak kodu konfigürasyondan gerçekten ayıran tek şey, dokümante edip etmemeniz ve son kullanıcılara nasıl değiştireceklerini söylemenizdir. Konfigürasyonun başlangıçta veya çalışma zamanında yorumlanıp derleme zamanında yorumlanmaması konusunda sahte bir argüman icat etmiş olabilirsiniz, ancak o zaman dinamik olarak yazılmış birkaç dil ve içinde kesinlikle bir komut dosyası motoru bulunan herhangi bir şeyi tanımlamaya başlayacaksınız (örneğin; çoğu oyun). Kod ve konfigürasyon, bunları etiketlemeye karar verdiğiniz her şeydir, başka bir şey değil, daha az bir şey değil.

Şimdi, orada olduğu için bir tehlike dışsallaştırıcı aslında değiştirmek güvenli olmayan bilgiler (yukarıdaki "yumuşak kodlama" bağlantıya bakın). Ünlü dizinizi bir yapılandırma dosyasında dışsallaştırırsanız ve onu son kullanıcılarınız için bir yapılandırma dosyası olarak belgelerseniz, uygulamanızı anında kırmak için neredeyse kusursuz bir yol sunarsınız, örneğin "q" harfini bir sesli harf olarak koyarak. Ancak bu, "kod ve verilerin ayrıştırılması" ile ilgili temel bir sorun değil, sadece kötü bir tasarım anlayışı.

Küçük geliştiricilere söylediğim şey, daima ortam başına değişmeyi bekledikleri ayarları dışlamaları gerektiğidir. Bu, bağlantı dizeleri, kullanıcı adları, API anahtarları, dizin yolları ve benzerlerini içerir. Bunlar sizin dev kutunuzda ve üretimde aynı olabilir , ancak muhtemelen değil ve sistem yöneticileri, devlere değil, üretimde nasıl görünmelerini isteyeceklerine karar verecekler. Bu nedenle, bazı makinelerde bir ayar grubunun ve diğer makinelerde uygulanan diğer ayarların (ergo, harici yapılandırma dosyaları (veya bir veritabanındaki ayarlar vb.) Yapılması için bir yönteme ihtiyacınız vardır.

Ancak bazı "verileri" basit bir şekilde "dosyaya" yerleştirmenin, onu yapılandırmayla dışlamakla aynı olmadığını vurguluyorum. Bir sözcük sözlüğünü bir metin dosyasına koymak, kullanıcıların (veya BT'nin) değiştirmesini istemeniz anlamına gelmez, bu, geliştiricilerin neler olup bittiğini anlamalarını ve gerektiğinde yapmalarını kolaylaştırmanın bir yoludur. ara sıra değişiklikler. Aynı şekilde, aynı bilgiyi bir veritabanı tablosuna koymak, tablonun salt okunur olması ve / veya DBA'ların asla onunla oynamaması istenmemesi durumunda, davranışın dışlanması olarak sayılmaz. Yapılandırma, verilerin değişebilir olduğunu, ancak gerçekte biçim seçimi yerine süreç ve sorumluluklarla belirlenen gerçek olduğunu gösterir.

Yani, özetlemek gerekirse:

  • "Kod" katı bir tanımlanmış terim değildir. Tanımınızı etki alanına özgü diller ve davranışı etkileyen herhangi bir şey içerecek şekilde genişletirseniz, bu görünür sürtünmenin çoğu ortadan kalkacak ve hepsi mantıklı olacaktır. Derlenmemiş, DSL "kodunu" düz bir dosyada olabilirsiniz.

  • "Veri", kullanıcılara veya en azından geliştiricilerden başka birine ait olan ve tasarım zamanında genellikle bulunmayan bilgileri belirtir. Bunu yapmak isteseniz bile kodlanmış olamaz. Kendini değiştiren kodun istisnası dışında, kod ile veri arasındaki ayrım kişisel bir tercih değil, bir tanım konusudur.

  • "Yumuşak kodlama" aşırı uygulandığı zaman korkunç bir uygulama olabilir, ancak dışsallaştırmanın her örneği zorunlu olarak yumuşak kodlama oluşturmaz ve bilgilerin "düz dosyalarda" saklanması çoğu kez dışsallaştırma için iyi niyetli bir girişim değildir.

  • Yapılandırma Soft-kodlama bunun özel bir türüdür olduğu , çünkü uygulama farklı ortamlarda çalışmasını gerekebileceğini bilginin gerekli. Uygulama ile birlikte ayrı bir yapılandırma dosyasını dağıtmak, kodun farklı bir sürümünü her ortama dağıtmaktan çok daha az iş (ve çok daha az tehlikeli) olur. Bu yüzden bazı yumuşak kodlama türleri gerçekten kullanışlıdır.


1

Bu klasik makaleyi Oren Eini (Ayende Rahien) tarafından okumanızı öneriyorum.

http://ayende.com/blog/3545/enabling-change-by-hard-coding-everything-the-smart-way

Ondan benim kendi paket servisim kolaylık ve okunabilirlik üzerine odaklanmak. Bu, yeniden yapılandırılması muhtemel olmayan şeylerin en iyi şekilde zor kodlanmış (kolayca okunabilir) olduğu anlamına gelebilir. Bu, parametreleri ifade etmek için bir programlama dilinin tam sözdizimini kullanmanın yanı sıra kod tamamlama ve yanlış kullanımda derleyici hataları gibi yararlı yan etkiler elde etmenizi sağlar.

Bu yolla potansiyel olarak ayrıştırma / yorumlama karmaşıklığından kaçınabilirsiniz ("ancak başka biri YAML / JSON'umu ayrıştırıyor" - ayrıştırılmış metni belirli API çağrılarıyla eşleme bir yorumlama şekli olabilir) ve "veriler arasındaki başka bir adımın karmaşıklığından kaçının "ve kullanımı.

Bazı durumlar, böyle bir senaryoda bile veride ifade edilmesine yol açar: örneğin, 3B alanda binlerce noktayı belirtmek, bir metin dosyası için koddan daha uygun olabilir; bunun için bile uygun olabilir.


1

Tamam, boş zamanlarınız için bir tür c ++ programı yazmak istediğinizi varsayalım. Ne yapması gerektiğini ve asla yapması gerekmeyeceğini biliyorsun. Şimdi "modern yazılım tasarımı" üzerine bir kitap alın. Oyunun kuralı Heres: Projenizdeki her sınıf ve her ne kadar küçük bir durumda, kodunuzu "temiz bir tasarım" yapmak için bu kitapta anlatılan her bir fantezi deseni uygulamak zorundasınız. Eh, "bağımlılık enjeksiyonu" pek çok kişi için yeterli olacak, sanırım. (Java + değil, c ++!) Programlama daha teorik bir bakış açısıyla öğretilir. İşi halletmen yeterli değil, bakımı kolay, aptal kanıtlayan bir kod yazmalısın ... her şey yolunda ve doğru. Ppl ne zaman sorun başlar. gerçek nedeni düşünmeyi bırak, tasarım desenleri icat edildi ve dogmatik oldu.

Mektup sayma aracınızı tek bir basit tasarım ilkesiyle (üstü) yazmanızı durduralım: Belirli bir türdeki giriş verisine belirli bir iş yapan bir kod yazdığınızda, belirli bir giriş için bu görevi gerçekleştirebildiğinden emin olun. bu türden veriler. - Bir harf sayım aracı yazmak istediğinizde, bir şekilde yazmanın anlamı açıktır, böylece yalnızca sesli harfleri saymakla kalmaz, aynı zamanda “herhangi bir harfi” de sayar. - Ayrıştırdığınız korpusun gerçekte ne olduğunu bilmiyor olabilirsiniz, çok genel bir kodlama seçebilir (UTF-16) ve çoğu (tümü?) Yazılı dilleri ve sembollerini de kapatabilirsiniz.

Bu noktaya kadar, iki argümanla (fonksiyon ve sayılacak harfler) bir işleve sahibiz. Harflerin de oldukça genel bir "tip" veya "sınıf" bulmakla ilgileniyoruz: ASCII sembollerinden daha iyisini yapabiliriz!

"Genelleme ve yeniden kullanılabilirlik" i kullanan bir iblis girin -dogma: - Neden o sınıfın giriş akışındaki herhangi bir sınıfın sembolünü saymıyorsunuz? (Harflerden bit dizilerine isteğe bağlı olarak ancak sonlu uzunlukta bir bilgisayarla elde edebileceğiniz en genel olandır ...) - Bekle, o zaman bile hala doğal sayılarla sayıyoruz. Ancak sayım, sayılabilir bir kümeden aksiyomları yerine getiren kendisine bir eşleme olarak genelleştirilebilir ...

Şimdi bu örnek aptalca olabilir, ancak bir sayma aracından daha karmaşık tasarım görevlerini göz önünde bulundurursanız, kitabınızda bulduğunuz bir tasarım desenine göre gereken ek soyutlamayı sunma fırsatını da bulabilirsiniz.

"Veri" ve "kod" un ayrılması muhtemelen önemsiz (işlev argümanları) olacak veya kendinizi değişmezleri değişken ("veri") olarak göreceksiniz.

Herhangi bir karışıklık varsa, "arayüzler" ve "hizmetler" ve tüm sınıf özelliklerinin (örneğin, türlerin) aniden "veri" olması, muhtemelen dışarıdan enjekte edilmesi gereken bağımlılıklar olabilir. Üniversitede öğretilen bilişim derslerinin felsefe dersleri gibi bir şey haline geldiğini ve öğrencilerin gerçek anlamda işe yarayan yazılımlar üretme konusunda tecrübe kazanmaları için daha az zaman bulunduğunu hissediyorum. Neden açık bir çözüm yerine delicesine karmaşık bir kalıp kullanmanız gerektiğini merak ediyorsanız, bu gelişme (muhtemelen) bu ihtiyacın nasıl yaratıldığını (…).

Özel probleminize: 1.) Özel durumunuz için maksimum kodlamaya sahip bir program yazabilir ve 2.) bu koddan doğrudan ileriye doğru bir şekilde genelleştirebilirsiniz. daha fazla fonksiyon argümanı tanıtmak ve diğer "önemsiz kalıpları" kullanmak, kodlama ve verileri ayırdığınızdan, bariz bir şekilde, işlevsel programlama icat edildiğinden bu yana olduğu gibi emin olabilirsiniz. (ofc 'i atlarsınız ve 2. anında ...)

Burada açık olmayan herhangi bir şey büyük olasılıkla "teori-kilitlenme" durumudur: Arayüze atıfta bulunan bir arayüz yazarken ve bir başka interfede ... ve sonunda tüm bu arayüzleri yapılandırmak için düzgün bir küçük xml-dosyanız var ve sınıf-arabirim-dağınıklığınıza enjekte edilecek bağımlılıklar.

Umarım, daha sonra ihtiyaç duyduğunuz xml ayrıştırıcısının çalışması için xml-config gerekmez ...

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.