Yanıtlar:
Özellik bayrakları, uzun ömürlü şube ve ürün geliştirmedeki çatışmalardan kaçınmak için kullanılabilecek bir mühendislik cihazıdır. Yeni bir sürümü ele alırken geliştiricilerin belirli bir ürün özelliği üzerinde işbirliği yapmalarına yardımcı olmak için nesne yönelimli bir dilin bağlamı nasıl kullanılabilir. Bu çözüm, “arayüz” kavramının mevcut olması koşuluyla, nesne yönelimli olmayan bağlamlarda da kullanılabilir. ( bkz. OCaml modül sistemi.)
Örnekleme amacıyla, bir veritabanında saklanan veriler hakkında raporlar sunan bir araç olduğunu varsayıyoruz. Kod , istekleri gerçekleştirmek için kullanılan bir DatabaseClient sınıfı uygular . Veri kümesi büyüdükçe, bazı alternatif veri düzeninin uygulama performansını artıracağı açıktır. Bu nedenle Alice , DatabaseClient'ın gelişmiş yerleşime sahip yapılardan veri alabilen yeni bir sürümünü geliştirirken Bob , tarihsel DatabaseClient'i koruyacaktır .
Aşağıdaki adımlarla Alice ve Bob, çatışmaları en aza indirirken kısa ömürlü dallarda işbirliği yapabilirler.
Alice , DatabaseClient'i DatabaseClient_v1 olarak yeniden adlandırır ve DatabaseClient_v1 nesnesini kullanan ve DatabaseClientInterface adlı bir arabirimi uygulayan DatabaseClient adlı bir temsilci sınıfı oluşturur . (Mümkünse, bu DatabaseClientInterface bir kod artefaktı olmalıdır , ancak ördek türü diller her zaman bunu desteklemez.)
Bob 1'de Alice tarafından yapılan değişiklikleri inceler ve bakım işinin DatabaseClient_v1'de gerçekleşmesi gerektiğinin farkındadır .
Alice davranışını yöneten uygulamasında yeni bir yapılandırma bayrak tanıtır DatabaseClient temsilci ve uygular bir DatabaseClient_v2 tutucudur, uygulayan bir sınıf DatabaseClientInterface yöntemleri tüm bir “uygulanmadı” istisna.
Bundan sonra, Alice ve Bob açık senkronizasyon olmadan işbirliği yapabilir, çünkü ilgili yinelemelerinde yazılan kod DatabaseClientInterface'e tabidir . Bu, eşzamanlı çalışmalarından kaynaklanan çatışma riskini en aza indirir.
Alice'in yinelemeleri, bir test uygulamak, bir yöntem uygulamak veya hatta kısmen yapmak gibi çok kısa olabilir, çünkü üretimde kod kullanım için seçilmemiştir ve tamamen işlevsel olması gerekmez. Otomatikleştirilmiş testsuite, DatabaseClientInterface öğesinin her zaman DatabaseClient_v1 kullanacağı şekilde yapılandırılmalıdır ; Alice , testsuite'i yerel olarak veya özel bir CI kurulumunda çalıştırırken DatabaseClient_v2'ye kolayca geçiş yapabilir . Her şey hazır olduğunda, tek bir taahhüt, DatabaseClient temsilcisini yöneten yapılandırma değerini güncelleyerek değişikliği gerçekleştirebilir .
Adımlar oldukça "kolay", bir özellik bayrak app taşımak için temelde iki şey gerekir:
Özellik bayrağının temeli, onları açmak / kapatmaktır, ancak yeni bir özelliği rampa gibi bir şekilde serbest bırakmak isteyeceksiniz, örneğin: Uygulamayı barındıran 5 sunucuda 1 sunucu başlatmak için "açık" özelliğine sahiptir, daha sonra tüm sunucular "açık" olana kadar özelliği başka bir sunucuda açarsınız.
Bu, özelliğinizin onsuz uygulama ile uyumlu olmasına dikkat etmeniz gerektiği anlamına gelir (örneğin DB'deki ekstra sütun).
Tekerleği yeniden icat etmekten kaçınmak için çeşitli dillerde çerçeveler var, şimdi Etsy'nin bakımsız olanı, nasıl çalıştığını açıklamak için ilginç bir benioku var .
Gömülü yazılım dünyası genellikle uygulama kodunun kendisinde ( örneğin #define
/ #ifdef
ifadeleri) ve / veya derleme araçları yapılandırma dosyalarında (örneğin) derleme zamanı bayraklarını kullanır makefile
.
Yapı bayrakları, yalnızca özellikler için değil, aynı zamanda her türlü kod yeniden düzenleme, taşıma, hata ayıklama desteği vb. İçin de benzer şekilde kullanılabilir. Entegrasyon dalında yapıyı bozmadan veya halihazırda şubede çalışan özelliklerde / projelerde gerilemelere neden olmadan kısmi veya doğrulanmamış değişikliklerin yapılmasına izin verir. Büyük / riskli / yavaş ilerleme değişikliklerinin (aksi takdirde uzun ömürlü bir dal gerektirecek) yanı sıra sürekli entegrasyon biçiminde nokta düzeltmelerini ele almak için mükemmeldir.
Ancak, regresyonlar için halihazırda mevcut olan şube kodunu doğrulamanın yanı sıra, yeni kodun ilerleme / kararlılık doğrulamaları yapmak da mümkündür. Bunun için derleme zamanı bayrakları değiştirilmelidir.
Bayrakları değiştirmenin bir yolu, aynı şubenin CI sisteminin ayrı bir doğrulama boru hattında (bu tür bir işlevi destekliyorsa), bayrağı açıp kapatan bir yama dosyası kullanmaktır. inşa etmek. Bu çalışma alanında farklı bir yapay yapı kümesi oluşturulacak ve daha sonra doğrulanacaktır.
Alternatif olarak, uzun ömürlü bir özellik dalı ana entegrasyon dalından çekilebilir, ancak bu özellik dalındaki tek değişiklik geçişli bayrak olacaktır. Bu küçük değişiklik nedeniyle, özellik dalı otomatik olarak son derece hızlı bir şekilde senkronize edilebilir - pratik olarak ana entegrasyon dalını çok yakından gölgelendirir. Bu dalda ayrı bir CI yürütmesi için artık ön yama dosyasına gerek kalmayacaktı. Uzun bir süre için bile bu özellik dalını taşımak önemsizdir.
Ana entegrasyon dalında, mevcut yapı yapılarının sadece klonları olacak, ancak bayraklar değiştirilmiş olarak yeni yapı yapıları oluşturmak da mümkün olabilir. Bu şekilde, yeni ana kodu doğrulamak için ne ön yama dosyası ne de özellik dalı gerekli olacaktır.