Kaldırılan kodun bir son tarihe ulaştıktan sonra derlemesini engelleyin [kapalı]


68

Ekibimde büyük bir yekpare projede (tüm sınıflar, yöntemler vb.) Birçok eski şeyi temizliyoruz.

Bu temizlik işleri sırasında normalden bir çeşit ek not mu yoksa kütüphane meraklısı mı olduğunu merak ediyordum @Deprecated. Bu @FancyDeprecated, belirli bir tarih geçtikten sonra eski kullanılmayan kodu temizlemediyseniz, projenin oluşturulmasının başarılı olmasını engellemelidir.

İnternette arama yapıyorum ve aşağıda açıklanan özelliklere sahip hiçbir şey bulamadım:

  • Belirli bir tarihten önce silmeyi planladığınız koda yerleştirmek için bir ek açıklama veya benzeri bir şey olmalıdır
  • bu tarihten önce kod derlenecek ve her şey normal şekilde çalışacaktır
  • Bu tarihten sonra kod derlenmeyecek ve size sorun hakkında sizi uyaracak bir mesaj verecektir.

Tek boynuzlu at arıyorum düşünüyorum ... Herhangi bir program dili için benzer bir teknoloji var mı?

Bir plan olarak BI, "son tarih" de başarısız olmaya başlayan, kaldırılması amaçlanan kodun bazı birim testleriyle sihir yapma olasılığını düşünüyorum. Bunun hakkında ne düşünüyorsun? Daha iyi bir fikrin var mı?


168
İtiraz, bir tarih için değil bir sürüm için yapılır . İnsanların kullanım dışı özellikleri kullanmayı bırakmasını istiyorsanız, onlarsız bir sürüm yayınlayın. Bu onların dikkatini çekecek ve henüz başaramazlarsa her zaman geri dönebilirler. Eski sürümlerde bir sürü insan sıkışmış. Programlarını kırma yolu değil.
isanae

4
B planı sağlam geliyor. Birim testinde neden onaylanmadığına dair yorum ekleyebileceğiniz avantajlar ile birlikte. Yorumun kaynak koduna eklenmesi büyük bir monolitte okunabilirliğe yardımcı olmaz
dwana

53
Bu gerçekten kötü bir tek boynuzlu at gibi geliyor. İyi derleyen, tüm testleri geçen ve bir müşteriye gönderdiğiniz bir yazılımınız var. Sonra bir gün, yazılımı tekrar kontrol edersiniz ve aynı geliştirme platformunda bile kurulmaz. Şimdi daha önce resmi testlerden geçen kodu değiştirmeniz ya da bilgisayarın saatini geri almak gibi kötü saldırılar yapmak zorundasınız.
Simon B

6
@ Deprecated_RemoveMe_2018_06_01 yapın ve ardından 2018-06-01 tarihinde ek açıklamanın kendisini silin. Voila, ek açıklama kullanan tüm kodların artık derlenmeyecek! (ek açıklama bulunmadığı için)
user253751

65
Gelecek yıllarda, yeni işe alınmış bir geliştirici soracak: derleme sunucusundaki zaman neden Ocak 2016'ya ayarlanmış? Ve 10 yıl boyunca orada olan adam ona gerekli olduğunu ya da yapının rastgele yerlerde kırıldığını söyleyecektir. İç çekmek.
Wilbert

Yanıtlar:


62

Derlemeyi yasakladığında bunun yararlı bir özellik olacağını sanmıyorum. 01/06/2018 tarihinde, bir gün önce derlenen kodun büyük bölümleri derlenmezse, ekibiniz bu açıklamayı tekrar kaldıracak, kod temizlenmiş veya temizlenmeyecek.

Ancak, gibi koda bazı özel açıklamalar ekleyebilirsiniz.

@Deprecated_after_2018_07_31

ve bu ek açıklamaları taramak için küçük bir araç oluşturun. (Eğer yansıma kullanmak istemiyorsanız, grep'teki basit bir astar bunu yapacaktır). Java dışındaki dillerde, "grepping" için uygun standart bir yorum ya da önişlemci tanımı kullanılabilir.

Ardından bu aracı belirli bir tarihten kısa bir süre önce veya sonra çalıştırın ve yine de bu açıklamayı bulursa, ekibe derhal bu kod bölümlerini temizlemesini hatırlatın.


9
@Bergi: hey, bu sadece bir örnek, OP kontrollerinde tercih ettikleri ne olursa olsun sürümleri veya tarih etiketlerini kullanabilir.
Doktor Brown,

4
Bunu normal amortisman özelliklerini kullanarak ve derleyicinin belirli bir tarihte çıktısına bakarak yapmanın bir avantajı görmüyorum. Zaten var olan bir şeyi yeniden uygulamak için geliştirici zamanının zayıf kullanılması gibi görünüyor. Zaten bir ton uyarınız olsa bile (temizlemeye zaman ayırmaya değecektir), kesinlikle derleyicinin tüm uyarıları bir metin dosyasına vermesini ve sonra grep etmesini veya aramasını sağlayabilirsiniz.
jpmc26

4
@jpaugh Şu araçlar ne olursa olsun, mevcut araçlarla verimli bir şekilde yapabileceğiniz görevleri yapmak için yeni araçlar oluşturmak için saatler (not, zaman = para) batmamasını öneririm.
jpmc26

3
@ jpmc26: İki (küçük) avantaj görüyorum: tonlarca kullanımdan çıkarma uyarısı almamak (bu, daha önemli olanları görmeme riski doğuracak) ve farklı kod bölümleri için farklı kullanımdan kaldırma kriterleri (tarihler, sürümler, her neyse) getirme olasılığı. Ayrıca, OP açıkça bir tarih ile eşleşmeden mahrum bırakılmasını istedi.
Doktor Brown,

7
Örneğinizdeki tarih için sadece YYYY-AA-GD siparişini kullanırsanız + 1'i kullanırdım, çünkü daha önce sadece belirsiz olanı gördüm.
mtraceur

284

Bu, saatli bomba olarak bilinen bir özelliktir . ZAMAN BOMBALARI OLMAYIN.

Kod olursa olsun yapılandırmak ve bunu belgelemek ne kadar iyi, olacak belli yaştan sonra yaşıyorsa bir kötü anlaşılmış neredeyse mitolojik kara kutu dönüşür. Gelecekte ihtiyaç duyan herhangi birinin ihtiyacı olan son şey, onları tamamen şaşırtan, en kötü zamanda ve bariz bir çare olmadan tamamen yakalayan başka bir garip başarısızlık modudur. Kasıtlı olarak böyle bir sorun üretmenin hiçbir bahanesi yoktur.

Şuna şöyle bak: Eğer eskimeye değer verdiğin ve onu takip edebileceğin kadar kod temelinin farkında ve örgütlüysen, sana hatırlatmak için kodun içinde bir mekanizmaya ihtiyacın yok . Olmazsa, olasılıklar, kod tabanının diğer yönleri hakkında da güncel olmamanızdır ve muhtemelen alarma zamanında ve doğru şekilde yanıt veremeyeceksiniz. Başka bir deyişle, saatli bombalar kimse için iyi bir amaca hizmet etmiyor. Sadece hayır de!


74
1 Bu edecektir sizi ısırırlar. Aylar sonra. Bir Cuma günü, acil bir konuşlandırma yapmaya çalıştığın gibi. Ve bu uzun bir hafta sonu, yani onun hakkında bir şey bilen tüm insanlar ofis dışında. Yapma
Roger Lipscombe

3
Anlaşmak. Eskime bir kodlama sorunu değil, örgütsel bir konudur. Hala bir elmayı takabilirim] [ve BASIC yazıyor, beni durduracak hiçbir şey yok. Ama, ben ederim istiyorum nasıl?

19
"Organize ve farkında" yönünüzü izlemenin doğru çözümü, hata izleme sisteminizde, yorumlardaki önerilen zaman dilimi içinde "<<ve benzeri> kaldır>" diyerek bir hatayı yükseltmektir. Ardından, hata incelemesinin bir sonraki sürümde nelerin düzeltilmesi gerektiğini bulmak için ortaya çıktığında 6 ay içinde, bu zaman aralığı yaklaşıyorsa, "bunu yapmanın zamanı geldi" diyorsunuz. Temel proje yönetimi.
Orbit

1
Aslında, yayın planınız yeterince tahmin edilebilirse, şimdi sadece kilometre taşı.
Orbit

13
Alternatif için isanae'nin yorumuna bakın : " İnsanların kullanımdan kaldırılmış özellikleri kullanmayı bırakmasını istiyorsanız, onlarsız bir sürüm yayınlayın. Bu onların dikkatini çekecek ve henüz başaramazlarsa her zaman geri dönebilirler. "
Stevoisiak

70

C # ObsoleteAttribute'da aşağıdaki şekilde kullanırsınız:

  • Sürüm 1'de, özelliği gönderirsiniz. Bir yöntem, sınıf, her neyse.
  • Sürüm 2'de, orijinal özelliği değiştirmeyi amaçlayan daha iyi bir özellik sunarsınız. Özelliğe bir Obsolete niteliği koydunuz, "uyarı" olarak ayarladınız ve "Bu özellik kullanımdan kaldırılmış. Bunun yerine daha iyi bir özellik kullanın. Bu kitaplığın 3. sürümünde, böyle bir sürümde çıkacak bir tarih, bu özelliğin kullanımı bir hata olacaktır. " Artık özellik kullanıcıları hala kullanabilir, ancak yeni özelliği kullanmak için kodlarını güncellemek için zamanları var.
  • Sürüm 3’de, bir uyarı yerine bir hata olarak özniteliği günceller ve "Bu özellik kullanım dışıdır. Bunun yerine daha iyi bir özellik kullanın." Bu kitaplığın 4. sürümünde, bu tür bir sürümde yayınlanacak Bir tarih, bu özellik atar. " Önceki uyarınıza aldırmayan kullanıcılar hala, sorunu nasıl çözeceklerini söyleyen yararlı bir mesaj almaya devam ediyor ve düzeltmeleri gerekiyor çünkü kodları derlenmiyor.
  • 4. sürümde, özelliği bazı önemli istisnalar atacak şekilde değiştirirsiniz ve özelliğin bir sonraki sürümde tamamen kaldırılacağını söylemek için mesajı değiştirirsiniz.
  • 5. sürümde, bu özelliği tamamen kaldırırsınız ve kullanıcılar şikayet ederse, iyi hey, onlara üç sürüm adil uyarı döngüsü verdiniz ve güçlü bir şekilde hissediyorlarsa sürüm 2'yi kullanmaya devam edebilirler.

Buradaki fikir, etkilenen kullanıcılar için mümkün olduğunca acısız bir kırılma değişikliği yapmak ve bu özelliği kütüphanenin en az bir sürümü için kullanmaya devam edebilmelerini sağlamaktır.


2
Bunun doğru yaklaşım olduğuna inanıyorum, ancak kullanıcılar şikayet edince "şikayet" durumunda "değişecek" bir şeyi değiştireceğim
Liath

10
Bir gövdeye aynı anda geçmek, aynı hatayı değiştirirken garip görünüyor. Kullanımdan kaldırılan hata sürümünün avantajlarından biri, önceki sürümlere karşı oluşturulan kodun yeni derlenmiş kodun kullanılmasını önlerken çalışmaya devam etmesine izin vermesidir. Böylece, siz de API uyumluluğunu kasıtlı olarak kırarak ABI uyumlu kalırsınız. Tabii ki mükemmel dünya, daha önce derlenmiş bir uygulama ile yeni kodu hiç çalıştırmayacaksınız, ancak birçok proje bu ideale asla ulaşamıyor.
Kevin Cathcart

@KevinCathcart: Bu iyi bir nokta; belki orada başka bir aşama garantilidir! Metni güncelleyeceğim.
Eric Lippert

1
Aslında, eğer SemVer kullanıyorsanız, XY0 sürümündeki (kullanımdan kaldırılan herhangi bir küçük sürüm olmalıdır) X + 1.0.0 sürümünden tamamen kaldırılabilir. Biraz daha uzaklaşmanın iyi olacağını söyleyebilirim (X + 2.0.0'a?), Ama bu beş aşamalı süreç muhtemelen zambakı incitiyor. "Uyarı" sonrası bir sonraki adım "ölümcül hata" olmalıdır (kullanımdan kaldırılan özellik hata üreten kodla değiştirildiği için). Yana libfoo.so.2ve libfoo.so.3başka gayet biriyle bir arada bulunabilir, bunlar üzerinde açık olsun kadar eski kütüphane kullanmaya devam edebilirsiniz mansap.
Monty Harder

@MontyHarder: Tabii. Olayların tam sırası, geliştiricinin ve kullanıcı topluluğunun ihtiyaçları tarafından belirlenebilir. Yine de daha önemli olan nokta, paydaşlara açıkça iletilen bu türden versiyonlama sorunlarıyla başa çıkma konusunda düşünülmüş bir politika olması gerektiğidir.
Eric Lippert

24

"Onaylanmayan" ın ne anlama geldiğini yanlış anladınız. Kullanımdan kaldırılmış demektir:

Kullanılabilir olmak, ancak eski haline getirilmiş olması nedeniyle eski ve en iyi şekilde kaçınılması olarak kabul edilir.

Oxford Sözlükleri

Tanımı gereği, kullanımdan kaldırılmış bir özellik yine de derlenir.

Özel bir tarihte özelliği kaldırmak istiyor . Bu iyi. Bunu yapma şekliniz, o tarihte kaldırmanızdır .

O zamana kadar kullanımdan kaldırılmış, eski veya programlama diliniz ne diyorsa onu işaretleyin. Mesaja, çıkartılacağı tarihi ve yerini alacak olanı ekleyin. Bu, diğer geliştiricilerin yeni kullanımlardan kaçınmaları ve mümkün olduğunca eski kullanımların yerine geçmesi gerektiğini belirten uyarılar üretecektir. Bu geliştiriciler buna uyacak ya da görmezden gelecekler ve biri çıkarıldığında bunun sonuçlarını ele almak zorunda kalacak. (Duruma bağlı olarak, siz olabilir veya onu kullanan geliştiriciler olabilir.)


Düşürücünün neye katılmayacağı ile ilgileniyorum.
jpmc26

2
+1. Çevik gelişim için JIRA kullanıyorsanız, bir görev oluşturun ve gelecekteki bir koşuya koyun; takip ettiğiniz diğer proje yönetim araçları ve metodolojisine uyum sağlayın. Bu en iyi teknik olmayan yöntemlerle çözülür.
Matthew

1
Ayrıca, Sınıf / Lib'in belgelerde Xx
Phil M

12

Unutmayın, daha önce piyasaya sürülen yazılım sürümlerini desteklemek için kodun eski sürümlerini oluşturma ve hata ayıklama özelliğini elinizde bulundurmanız gerekir. Belirli bir tarihten sonra bir yapının sabote edilmesi, ayrıca gelecekte meşru bakım ve destek çalışmaları yapmanıza engel olacağınız anlamına gelir.

Ayrıca, derleme işlemimden önce makinemin saatini bir veya iki yıl öncesine ayarlamak çok basit bir çözüm gibi görünüyor.

Unutmayın, "itiraz", gelecekte bir şeylerin ortadan kalkacağına dair bir uyarıdır. İnsanların bu API'yi kullanmalarını zorla önlemek istediğinizde , ilgili kodu kaldırmanız yeterlidir . Bazı mekanizmalar kullanılmaz hale gelirse kod tabanında kod bırakmanın anlamı yoktur. Kodun kaldırılması, aradığınız derleme zamanı denetimlerini size verir ve önemsiz bir geçici çözüm bulunmaz.

Düzenleme: Sorunuzda "eski kullanılmayan kod" bölümüne bakın. Eğer kod gerçekten kullanılmamışsa , kullanımdan kaldırmanın anlamı yoktur. Sadece sil.


Şimdiye kadarki en iyi cevap, belki de kodun silinmesinin, cevabınızdaki sorunu çözmenin en iyi yoludur. Metin cevaplarının duvarını kaydırmak daha kolay olabilir
Clint

6

Daha önce böyle bir özellik görmemiştim - belirli bir tarihten sonra yürürlüğe giren bir açıklama.

Ancak @Deprecated, bu yeterli olabilir. CI'deki uyarıları yakalayın ve varsa yapıyı kabul etmeyi reddetmesini sağlayın. Bu, sorumluluğu derleyiciden derleme hattınıza kaydırır, ancak ek adımlar ekleyerek derleme hattınızı kolayca değiştirebilmeniz (yarı) yapabilirsiniz.

Bu yanıt unutmayın gelmez (örneğin yerel uyarılarla rağmen, yine de başarılı olur geliştiricinin makinasında üzerine inşa) tam sorunu çözmek ve bir CI boru hattı kurmak ve çalışır durumda olduğunu varsayar.


4

Takvimler veya yapılacaklar listesi arıyorsunuz .

Başka bir alternatif, kod tabanınızda herhangi bir uyarı varsa çok azına sahip olmayı başarırsanız, özel derleyici uyarıları veya derleyici mesajları kullanmaktır. Çok fazla uyarınız varsa, ilave çaba harcamanız (yaklaşık 15 dakika?) Ve sürekli entegrasyonunuzun her bir yapıda sağladığı derleme raporunda derleyici uyarısını almanız gerekir .

Kodun düzeltilmesi gerektiği hatırlatmaları iyi ve gerekli Bazen bu hatırlatıcıların gerçek dünyadaki son tarihleri ​​katıdır, bu yüzden onları bir zamanlayıcıya koymak da gerekli olabilir.

Amaç, insanlara konunun var olduğunu ve belirli bir zaman diliminde düzeltilmesi gereken şeyleri sürekli olarak hatırlatmaktır - yapıyı belirli bir zamanda basitçe bozan bir özellik, yalnızca bunu yapmakla kalmaz belirli bir zaman diliminde düzeltilmek.


1
Anlaşmak. Ancak bir sorun varsa ve belirli bir zaman diliminde düzeltilmesi gerekiyorsa, o zaman doğru zamanda birisinin birinci önceliği haline gelmesi gerekir. Bir toplantıda Müdürümün bana "birinci öncelik" verdiğini hatırlıyorum, daha sonra " Bu sizin bir numaralı önceliğiniz" dedi (farklı bir şey). Danışmanım, “ İki numaralı önceliği olamaz !” Dedi . Yönetici şaşırmıştı. Sanırım o düşündüm ki ... yapabilirdim. "Doğru zamanda" düzeltilmesi gereken bir şeyin planlanması, zamanın tükenmesini planlamaktadır.

3

Bunu düşünmenin bir yolu, zaman / tarih ile ne demek istediğinizi ? Bilgisayarlar bu kavramların ne olduğunu bilmiyor: bir şekilde programlanmaları gerekiyor. Bu oldukça yaygındır temsil "Dönemden beri saniye" nin UNIX formatında kez ve OS görüşmesi ile bir programa belirli bir değer beslemek için yaygındır. Ancak, bu kullanım ne kadar yaygın olursa olsun, "gerçek" zaman olmadığını unutmamak önemlidir: bu sadece mantıklı bir sunumdur.

Diğerlerinin de belirttiği gibi, bu mekanizmayı kullanarak bir "son tarih" koyduysanız, farklı bir zamanda beslemek ve bu "son tarihi" kırmak önemsizdir. Aynı şey, NTP sunucusuna soru sorma gibi daha ayrıntılı mekanizmalar için de geçerlidir ("güvenli" bir bağlantı üzerinden bile, çünkü kendi sertifikalarımızı, sertifika otoritelerini değiştirebilir veya kripto kütüphanelerini ekleyebiliriz). İlk başta, bu tür bireylerin mekanizmanız üzerinde çalışmak için hatalı oldukları görünebilir, ancak otomatik olarak yapılması ve iyi nedenlerden dolayı olabilir . Örneğin, yeniden üretilebilir yapılara sahip olmak ve bunun deterministik olmayan sistem çağrılarını otomatik olarak sıfırlayabilmesi / engellemesine yardımcı olacak araçlar olması iyi bir fikirdir . libfaketime tam olarak bunu yapar,tüm dosyanın zaman damgalarını ayarlar 1970-01-01 00:00:01; Qemu'nun kayıt / tekrar oynatma özelliği tüm donanım etkileşimlerini vb. taklit eder.

Bu, Goodhart yasasına benzer : bir programın davranışını mantıksal zamana bağlı olarak yaparsanız, mantıksal zaman "gerçek" zamanın iyi bir ölçütü olmaktan çıkar. Başka bir deyişle, insanlar genellikle sistem saatiyle uğraşmazlar, ancak onlara bir sebep verirseniz derler.

Zamanın başka bir mantıksal temsili vardır: bunlardan biri yazılımın sürümüdür (uygulamanız veya bazı bağımlılıklar). Bu, örneğin UNIX zamanından daha "son tarih" için daha çok istenen bir temsildir, çünkü önemsediğiniz şeye özgüdür (özellik kümelerini / API'leri değiştirme) ve bu nedenle ortogonal kaygıları çiğneme olasılığı daha düşüktür (örneğin, UNIX zamanına uyma gibi) son teslim tarihini aşmak, günlük dosyalarının, cron işlerinin, önbelleklerin vb.

Diğerlerinin dediği gibi, kütüphaneyi kontrol ediyorsanız ve bu değişikliği "zorlamak" istiyorsanız, özellikleri kullanımdan kaldıran yeni bir sürümü (tüketicilerin kullanımlarını bulmasına ve güncellemesine yardımcı olmak için uyarılara neden olur) itip, tamamen özellikleri. İsterseniz (hemen sonra) sürümler yalnızca zamanın mantıksal bir gösterimi olduğundan, "gerçek" zamanla ilgili olmaları gerekmiyorsa, bunları hemen sonra yayınlayabilirsiniz. Anlamsal versiyonlama burada yardımcı olabilir.

Alternatif model, değişikliği "çekmek" tir. Bu sizin "B planınız" gibidir: Tüketici uygulamasına bir test ekleyin; bu bağımlılık sürümünün en azından yeni değer olduğunu kontrol eder. Her zamanki gibi, bu değişikliği kod tabanından yaymak için kırmızı / yeşil / refactor. İşlevsellik "kötü" veya "yanlış" değilse, sadece "bu kullanım durumu için uygun" ise, bu daha uygun olabilir.

"Çekme" yaklaşımıyla ilgili önemli bir soru, bağımlılık sürümünün bir "birim" ( işlevsellik ) olarak sayılıp sayılmadığıdır ve bu nedenle test etmeyi hak eder; ya da sadece gerçek birim ( işlevsellik ) testlerinin bir parçası olarak yapılması gereken sadece “özel” bir uygulama detayı olup olmadığı . Diyelim ki: Bağımlılığın sürümleri arasındaki fark gerçekten uygulamanızın bir özelliği olarak sayılıyorsa, testi yapın (örneğin, Python sürümünün> = 3.x olduğunu kontrol edin). Eğer değilse, o zaman yapmatesti ekleyin (kırılgan, bilgisiz ve aşırı kısıtlayıcı olacağından); Kütüphaneyi kontrol ediyorsanız "basma" rotasından aşağı inin. Kütüphaneyi kontrol etmezseniz, sağlanan sürümleri kullanın: testleriniz başarılı olursa kendinizi sınırlandırmaya değmez; eğer geçemezlerse, işte oradaki "son tarihin" budur!

Bir bağımlılığın özelliklerinin belirli kullanımlarından vazgeçmek istiyorsanız (örneğin, kodunuzun geri kalanıyla iyi çalışmayan bazı işlevleri arama), özellikle bağımlılığı kontrol etmiyorsanız başka bir yaklaşım daha vardır: kodlama standartlarınızı yasaklayın. / bu özelliklerin kullanımını engeller ve onlar için linter'ınıza kontroller ekler.

Bunların her biri farklı durumlarda geçerli olacaktır.


1

Bunu paket veya kütüphane düzeyinde yönetiyorsunuz. Bir paketi kontrol ediyorsun ve görünürlüğünü kontrol ediyorsun. Görünürlüğü geri çekmekte özgürsün. Bunu dahili olarak büyük şirketlerde gördüm ve yalnızca açık kaynak kodlu veya kullanımı ücretsiz olsa bile, paketlerin sahipliğine saygı duyan kültürlerde mantıklı geliyor.

Bu her zaman dağınıktır çünkü müşteri ekipleri hiçbir şeyi değiştirmek istemez, bu nedenle çoğu zaman yalnızca belirli listeye ihtiyaç duyarsınız - yalnızca belirli müşterilerle birlikte çalışmak için son tarih konusunda uzlaşmak için anlaşırsınız, muhtemelen onlara destek sunar.


Destek kısmını seviyorum. Tüm değişiklikler daha yumuşak, daha keyifli ve büyük olasılıkla daha az zorluk çekiyorsa, onları tanıtan insanlar destek verirse. Bu kısmen psikolojik bir etki: İyi destek kooperatif; tüm dahil ciddi alır. Buna karşılık, yukarıdan dayatılan değişiklikler ilgililerin ilgisini çekmeden onları ihmal ve işbirliği yapmadıklarını hissettirmektedir. (Arkadaşlık, değişiklikleri atlatmak için amansız bir sürüşle eşleştirilmeli.)
Peter - Monica

1

Bir gereklilik, yapıya bir zaman kavramı getirmektir. C, C ++, ya da diğer diller / C benzeri bir önişlemci kullanan sistemleri kurmak 1 , tek bir yapı anda önişlemci için tanımlayıp aracılığıyla bir zaman damgası getirebilir: CPPFLAGS=-DTIMESTAMP()=$(date '+%s'). Bu büyük olasılıkla bir makefile olur.

Kodda biri belirteçle karşılaştırır ve zaman doluysa hataya sebep olur. Bir işlev makrosu kullanmanın birinin tanımlamadığı durumu yakaladığını unutmayın TIMESTAMP.

#if TIMESTAMP() == 0 || TIMESTAMP() > 1520616626
#   error "The time for this feature has run out, sorry"
#endif

Alternatif olarak, kişi zamanı geldiğinde söz konusu kodu "tanımlayabilir". Bu, hiç kimsenin kullanmaması şartıyla programın derlenmesini sağlayacaktır. Diyelim ki, api, "api.h" yi tanımlayan bir başlığımız var ve old()belirli bir süre sonra arama yapmaya izin vermiyoruz :

//...
void new1();
void new2();
#if TIMESTAMP() < 1520616626
   void old();
#endif
//...

Benzer bir yapı muhtemelen old()işlev gövdesini bir kaynak dosyadan kaldırır .

Tabii ki bu aptal kanıtı değil; Birisi, TIMESTAMPbaşka bir yerde bahsedilen Cuma gecesi acil durum inşaatı durumunda eskileri tanımlayabilir . Fakat bence oldukça avantajlı.

Bu açıkça, yalnızca kitaplık yeniden derlendiğinde çalışır - bundan sonra eski kod yalnızca kitaplıkta bulunmaz. O olur değil ama eskimiş ikili bağlantı istemci kodu engeller.


1 C # sadece önişlemci sembollerinin basit tanımını destekler, sayısal değerler yoktur, bu da bu stratejiyi uygulanabilir değildir.


Bu önişlemcinin tanımlamasının TIMESTAMP, her derlemede yeniden derlenecek tüm kodları zorlayacağına dikkat etmek de önemlidir. Aynı zamanda gibi araçları iş göremez ccache. Bu, artımlı yapımlar için tipik derleme süresinin, kod tabanının ne kadarının bu şekilde kullanımdan kaldırılan özelliklerden etkilendiğine bağlı olarak önemli ölçüde artacağı anlamına gelir.
Mindriot

@mindriot Bu ilginç bir özellik. Sanırım kodun içine bir zaman kavramı getiren her yöntemin de geçerli olduğunu düşünüyorum - OP açıkça "belirli bir tarih geçtikten sonra" dedi. Biri derleme sistemindeki zaman yönünü ele alabilir ve kodu yalnız bırakabilir. Ancak OP açıkça "koda girilen bir şey" istedi. Benim çözümüm, belirli bir derleme yönteminden bağımsız olma avantajına sahiptir. Aldatılabilir, ama bir şekilde ya da başka bir şekilde yiyecek ve içecek sağlamak zorundasınız.
Peter - Monica

Kesinlikle haklısın. Buradaki çözümünüz aslında OP'nin asıl sorusuna pratik bir çözüm sunan tek çözümdür . Yine de olumsuz tarafın altını çizmenin önemli olduğunu gördüm. Artıları ve eksileri tartmak OP'ye bağlı olacaktır. Bence TIMESTAMP, günlük bir ayrıntı düzeyi elde etmek için değeri 86400 olarak bölerek sağlıklı bir orta yol elde edilebileceğini ve dolayısıyla daha az yeniden derlenebileceğini düşünüyorum.
Mindriot

0

Visual Studio'da, belirli bir tarihten sonra hata veren bir derleme öncesi komut dosyası oluşturabilirsiniz. Bu derlemeyi önleyecektir. İşte 12 Mart 2018 (veya sonrasında bir hata atar bir senaryo burada alınan ):

@ECHO OFF

SET CutOffDate=2018-03-12

REM These indexes assume %DATE% is in format:
REM   Abr MM/DD/YYYY - ex. Sun 01/25/2015
SET TodayYear=%DATE:~10,4%
SET TodayMonth=%DATE:~4,2%
SET TodayDay=%DATE:~7,2%

REM Construct today's date to be in the same format as the CutOffDate.
REM Since the format is a comparable string, it will evaluate date orders.
IF %TodayYear%-%TodayMonth%-%TodayDay% GTR %CutOffDate% (
    ECHO Today is after the cut-off date.
    REM throw an error to prevent compilation
    EXIT /B 2
) ELSE (
    ECHO Today is on or before the cut-off date.
)

Bu betiği kullanmadan önce bu sayfadaki diğer cevapları okuduğunuzdan emin olun.


-1

Yapmaya çalıştığın şeyin amacını anlıyorum. Ancak diğerlerinin de belirttiği gibi, derleme sistemi / derleyici muhtemelen bunu uygulamak için doğru yer değildir. Bu politikayı uygulamak için daha doğal bir katmana SCM veya ortam değişkenleri olduğunu söyleyebilirim.

İkincisini yaparsanız, temel olarak bir amortisman öncesi çalışmasını işaretleyen bir özellik bayrağı ekleyin. Kullanımdan kaldırılmış sınıfı oluşturduğunuzda veya kullanımdan kaldırılmış bir yöntem çağırdığınızda, özellik bayrağını kontrol edin. Tek bir statik işlev tanımlayın assertPreDeprecated()ve bunu kullanımdan kaldırılan her kod yoluna ekleyin. Ayarlandıysa, assert aramalarını yoksayın. Bir istisna atmazsa. Tarih geçtikten sonra, çalışma zamanı ortamında özellik bayrağını ayarlayın. Kodda kalan herhangi bir kullanımdan kaldırılmış çağrı, çalışma zamanı günlüklerinde görünecektir.

SCM tabanlı bir çözüm için git ve git-flow kullandığınızı varsayacağım. (Değilse, mantık kolayca diğer VCS'lere uyarlanabilir). Yeni bir dal oluşturun postDeprecated. Bu dalda tüm kullanımdan kaldırılan kodu silin ve derleninceye kadar tüm başvuruları kaldırma üzerinde çalışmaya başlayın. Herhangi bir normal değişiklik masterdalda yapmaya devam eder . Entegrasyon zorluklarını en aza indirmek için kullanımdan kaldırılmayan tüm ilgili kod değişikliklerini mastertekrar birleştirmeye devam edin postDeprecated.

İtiraz tarihi sona erdikten sonra, içinden yeni bir preDeprecateddal oluşturun master. Sonra postDeprecatedtekrar birleştirmek master. Serbest bırakılmanın masterşubeden ayrıldığını varsayarsak, artık tarihten sonra kullanımdan kaldırılan şubeyi kullanıyor olmalısınız. Acil bir durum varsa veya sonuçları zamanında teslim edemezseniz, her zaman geri dönebilir preDeprecatedve bu dalda gerekli değişiklikleri yapabilirsiniz.


7
Bu yaklaşım lojistik bir kabusa benziyor. Neredeyse yinelenen paralel dalları korumaya başlarsanız, zamanınızın tamamını harcayacaksınız. Toplam atık.
Orbit

6
Paralel dallar sağlamanın, bunlardan birçoğunu kullanımdan kaldırmak için kullanmadan önce yalnızca kullanımdan kaldırılan işlevleri kaldırmak için birini kullanmanın, kesinlikle "endüstri standardı" olduğunu kabul edemem. Bunun amacı nedir? Evet, bir VCS otomatik olarak bazı birleştirmeler yapabilir, ancak mantıksal çatışmaları çözmek için geliştiricinin gözüyle birleştirme yapılmalıdır (ve sözcüksel olarak çözülemeyen bir çatışmanın olması durumunda ne olur?). Bunun için her gün keyfi bir şekilde birleştirme sistemi kurmak, sadece ... anlamsız. Özelliği kaldırma zamanı geldiğinde özelliği kaldırın.
Orbit

3
Çünkü salım kollarını korumak için iyi bir neden vardır (önemli yamaları destekleyerek). "Gelecekte yapabileceğim bir şeyi" branşında tutmak için iyi bir neden yoktur. Genel gider, faydası yok. Bu kadar basit.
Orbit

4
Onu nereden buldum? Kelimenin tam anlamıyla kullanımdan kaldırmanın tanımı. Gelecekte çıkarabileceğiniz bir şeyi kullanımdan kaldırıyorsunuz. Bu yüzden hiçbir şaşkınlık, kale direği hareket etme ve kesinlikle sadece "tartışmayı kazanmak için" hiçbir şey yapma şansı yok. Bu çalışmak istediğim herhangi bir kuruluşta "ders kitabı SCM dallanma kullanımı" değildir! Sanırım kabul etmemeyi kabul etmek zorunda kalacağız. İyi akşamlar!
Orbit'te Hafiflik Yarışları 19:

2
@lightness - resmen kod küçümseyen sadece bir "biz bir şey değil neden birçok birçok nedeni vardır olabilir biz buna toparlamaya zaman yapmak". Belki kullanımdan kaldırılan kod, resmi desteğin düştüğü bir kütüphane kullanır. Belki kullanımdan kaldırılmış kod, belirli bir tarihten sonra lisansının süresi biten IP'dir. Belki verilen tarihten sonra yeni düzenlemeler vardır ve kod uyumlu değildir. Fildişi bir kulede yaşıyorsanız, çözümünüz çok iyi ve iyi. Fakat gerçek dünyadaki örgütler her zaman bu tür durumlarla ilgilenir. Yazılımın işin ihtiyaçlarını karşılaması gerekir, bunun tersi doğru değildir.
user79126 9:18
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.