Ayrışma
Sonuçta, günün sonunda, derleyicilerimizin ve bağlayıcılarımızın özelliklerinden mahrum olmayan en temel tasarım düzeyinde beni ayrıştırmakla ilgili. Her bir başlığın sadece bir sınıfı tanımlamasını, pezevenk kullanmasını, sadece bildirilmesi gereken türlere ileriye yönelik bildirimleri yapmasını, tanımlanmamasını, <iosfwd>
kaynak dosyası başına bir başlık bile içerdiğini söyleyebilirim. sistemi bildirilmiş / tanımlanmış olan şey türüne göre tutarlı bir şekilde organize etmek.
Derleme Zamanı Bağımlılıklarını Azaltma Teknikleri
Ve tekniklerden bazıları biraz yardımcı olabilir, ancak kendinizi bu uygulamaları yorucu bulabilir ve hala sisteminizde ortalama kaynak dosyanızı bulabilirsiniz, iki sayfalık bir başlangıç sayfası gerekir. #include
Arayüz tasarımlarınızdaki mantıksal bağımlılıkları azaltmadan, derleme zamanı bağımlılıklarını başlık düzeyinde azaltmaya çok fazla odaklanırsanız, fırlatma zamanları ile biraz anlamlı bir şey yapma yönergeleri ve kesinlikle "spagetti başlıkları" olarak kabul edilemeyebilir. Hala benzer zararlı meselelere pratikte üretkenliğe dönüştüğünü söyleyebilirim. Günün sonunda, derleme üniteleriniz hala bir şeyler yapmak için bir tekne yükü bilgisine ihtiyaç duyuyorsa, o zaman artan inşa sürelerine çevrilecek ve potansiyel olarak geri dönmeniz ve geliştiricileri yaparken bir şeyleri değiştirmek zorunda kalacağınız nedenleri çoğaltacak. Günlük kodlama işlemlerinin bitmesini sağlamak için sisteme kafa tutuyormuş gibi hissediyorum. O'
Örneğin, her alt sistemin çok soyut bir başlık dosyası ve arabirim sağlamasını sağlayabilirsiniz. Ancak eğer alt sistemler birbirinden ayrılmazsa, çalışmak için karışıklık gibi görünen bir bağımlılık grafiğine sahip diğer alt sistem arayüzlerine bağlı olarak, alt sistem arayüzleriyle tekrar spagetti benzeri bir şey alırsınız.
Dış Tiplere Yönelik Beyanlar
Geliştiriciler bazen iki saat süren eski bir kod temeli elde etmeye çalışmak için harcadığım süre içerisinde geliştiriciler bazen 2 gün boyunca, yapı sunucularımızdaki CI'ye dönüşlerini bekledi (bu makinelerin neredeyse hiç bitmemiş bir yük canavarı olarak hayal edebiliyorsunuz. geliştiriciler değişikliklerini zorlarken devam etmemek ve başarısız olmak için), bana en tartışmalı olanı diğer başlıklarda tanımlanan türleri bildirmek oldu. Ve bu kod üssünü küçük adımlarla yaptığım yaşlardan sonra "tepe spagetti" yi düşürmeye çalışırken, başlarda en tartışmalı uygulama olan "başlıklı spagetti" yi azaltmaya çalışırken (asıl doğanın bakış açısını kaybetmeme neden oldu.) Tünel, başlık bağımlılıklarına bakıldığında tasarım) diğer başlıklarda tanımlanmış türleri bildirir.
Foo.hpp
Gibi bir şey içeren bir başlık düşünün :
#include "Bar.hpp"
Ve yalnızca Bar
başlıkta tanımını değil, bildirim gerektiren bir şekilde kullanır . o zaman başlıkta görünür class Bar;
tanımını yapmaktan kaçınmak için ilan etmek hiç akıllıca Bar
görünmeyebilir. Uygulamada sık sık, ya da yine de, kendilerini en fazla dahil etme zorunluluğuyla tanımlanmaya Foo.hpp
ihtiyaç duyan derleme birimlerinin çoğunu bulursunuz ya da gerçekten yardım eden başka bir senaryoya girersiniz. senin o derleme birimlerinin% içermeden çalışabilir o zaman daha temel tasarım sorusunu gündeme dışında (ya da en azından bence olması gerektiği günümüzde) bile bildirimi bkz gerek neden ve niçinBar
Bar.hpp
Foo.hpp
Bar.hpp
Bar
Foo
çoğu kullanım durumuyla ilgisiz ise bile bunu bilmek bile rahatsız edilmek zorundadır (neden bir tasarımın daha önce hiç kullanılmadığı başka birine bağlı bir tasarım yükü olsun?).
Kavramsal Çünkü biz gerçekten ayrılmış değil Foo
gelen Bar
. Biz sadece bunu yaptık, böylece başlığın başlığı Foo
hakkında fazla bilgiye ihtiyaç duymaz Bar
ve bu ikisi birbirinden tamamen bağımsız kılan bir tasarım kadar önemli değil.
Gömülü Komut Dosyası
Bu gerçekten daha büyük ölçekli kod tabanları içindir, ancak son derece yararlı bulduğum bir başka teknik de sisteminizin en üst düzeyindeki bölümleri için gömülü bir betik dili kullanmaktır. Lua'yı bir günde gömebildiğimi ve sistemimizdeki tüm komutları eşit bir şekilde arayabildiğimi buldum (komutlar soyut, neyse ki). Ne yazık ki, geliştiricilerin başka bir dilin tanıtımını ve belki de en tuhaf bir şekilde en büyük şüpheleri olan performanslarını güvensizleştirdiği bir barikatla karşılaştım. Yine de diğer kaygıları anlayabilsem de, kullanıcılar sadece kendi başlarına ciddi bir döngüye neden olmayan düğmeleri tıklattıklarında komutları çağırmak için komut dosyasını kullanmak için kullanıyorsak, performans sorun olmamalı (ne yapmaya çalışıyoruz, düğme tıklaması için yanıt sürelerinde nanosaniye farklılıklarından endişe?).
Örnek
Bu arada, büyük kod tabanlarındaki derleme zamanlarını azaltmak için yorucu tekniklerden sonra şimdiye kadar tanık olduğum en etkili yol , sistemdeki herhangi bir şeyin çalışması için gereken bilgi miktarını gerçekten azaltan, yalnızca bir başlığın derleyiciden ayrılmasını değil perspektif ancak bu arayüzlerin kullanıcılarının bildiklerinde (hem insan hem de derleyici bakış açısından, derleyici bağımlılıklarının ötesine geçen gerçek bir ayrılma) bilmesi gereken her şeyi yapmalarını zorunlu kılan asgari değer.
ECS sadece bir örnektir (ve bir tane kullanmanızı önermiyorum), ama bununla karşılaştığımda, şablonlar ve diğer birçok kaliteyi mutlu bir şekilde kullanırken ECS’nin, doğası, sistemlerin sadece ECS veritabanı hakkında bilmesi gereken ve tipik olarak bir avuç bileşen türünü (bazen sadece bir tane) yapması gereken çok ayrık bir yapı yaratır:
Tasarım, Tasarım, Tasarım
İnsan, kavramsal düzeyde bu tür ayrıştırılmış mimari tasarımlar, kod tabanınız büyüdükçe ve büyüyüp büyüdükçe derleme sürelerini en aza indirgeme açısından daha etkilidir, çünkü bu büyüme sizin ortalamanıza çevrilmez, çünkü derleme için gerekli olan miktar bilgisini ve çalışmak için bağlantı zamanlarını çarpma derleme birimi (ortalama geliştiricinizin bir şeyler yapmak için bir yük dolusu malzeme içermesini gerektiren herhangi bir sistem de onları gerektirir ve sadece derleyicinin bir şey yapmak için büyük miktarda bilgi bilmesini gerektirir. ). Ayrıca, geliştirme sürelerinin kısalmasından ve dolaşmayan başlıklardan daha fazla avantaja sahiptir, çünkü geliştiricilerin sistemle ilgili bir şeyler yapmak için hemen gerekli olanın ötesinde bir şey bilmesi gerekmediği anlamına gelir.
Örneğin, AAA oyununuz için milyonlarca LOC'yi kapsayan bir fizik motoru geliştirmek üzere uzman bir fizik geliştiricisi kiralayabilir ve mevcut türler ve ara yüzler gibi en az minimum bilgiyi öğrenirken çok hızlı bir şekilde başlayabilir. Sistem konseptlerinizin yanı sıra, o zaman doğal olarak hem onun hem de derleyicinin fizik motorunu inşa etmesini gerektiren daha az miktarda bilgiye çevrilecek ve aynı zamanda genellikle spagetti'ye benzeyen bir şey olmadığını ima ederek inşa sürelerinde büyük bir azalmaya çevrilecektir. sistemin herhangi bir yerinde. İşte tüm bu diğer tekniklere öncelik vermeyi öneriyorum: sistemlerinizi nasıl tasarladığınız. Aksi takdirde, diğer teknikleri tüketmek en üstte buzlanma yapacaktır.