Java'da geliştirilmekte olan bir sınıf nasıl işaretlenir


12

Bir staj projesi üzerinde çalışıyorum, ama her şeyi bitirmeden önce gitmem gerekiyor.

Üretim kullanımı için yeterince kararlı olmayan 1 sınıfım var. Bu sınıfı işaretlemek / işaretlemek istiyorum, böylece diğer insanlar yanlışlıkla üretimde kullanmayacaklar. Zaten Javadoc'a bildirimde bulundum, ancak bu yeterli görünmüyor. Bazı derleyici hataları veya uyarılar daha iyi olur.

Kod şu şekilde düzenlenmiştir:

[Package] | company.foo.bar.myproject
          |-- Class1.java
          |-- Class2.java
          |-- Class3.java <--(not stable)

Kamu yöntemlerde bu sınıfları çağıran bir tek fabrika sınıfı olsaydı, ben yöntemini ayarlamak olabilirdi class3olarak private. Ancak, API bu şekilde maruz kalmaz. Kullanıcılar bu sınıfı doğrudan kullanacaktır new Class1();, ancak üst düzey bir sınıfı özel yapamıyorum. Bu durumla başa çıkmanın en iyi yolu nedir?


1
"API yöntemlerle gösterilmiyor" ile ne demek istiyorsun? Bu sınıfın Reflection API'sı aracılığıyla kullanılması amaçlanıyor mu?
Tom G

5
Derleyici hatası mı? Neden sadece yapıcıda bir istisna atmıyor?
Mchl

Karışıklık için özür dilerim. Yazımı düzenledim.
Wei Shi


1
Sınıfı özel yapamazsınız, ancak yapıcısını özel yapabilirsiniz.
Peter Taylor

Yanıtlar:


15

Neden tüm kararsız sınıfları sürüm kontrol sisteminizde farklı bir dalda kontrol etmiyorsunuz?


2
Bana bunun kodu 'gizleyeceğini' söylüyor. Kod neredeyse başkalarının bazı küçük ayarlamalar yapmak için ihtiyaç duyduğu şeyi yaparsa. Bir şubeye koyarsanız asla görmeyebilirler ve her şeyi yeniden uygularlar.
c_maker

3
@c_maker: Şubenin var olduğunu ve içinde ne olduğunu bilmelerine izin vermek, ayrıldığında neyin geçtiğinin bir parçası olmalıdır.
Blrfl

2
@Birlf Başkalarının kullandıkları kod JavaDoc açıklamasını görmemesi konusunda endişeli ise, ürettikleri diğer belgeleri aramaya gideceklerinden şüpheliyim.
KeithB

Benim endişem, özelliğin hala gelişmekte olduğu, ancak scrum ustası herhangi bir nedenle bir kenara koymayı seçti (bizim durumumuzda E2E testini engelleyen moratoryum). Ustalaşmak için katılmazsak, yolda çok sayıda birleştirme çalışması olabilir. Biz sadece c`tor özel yapılmış ve @ Deneyim, sınıf gibi, Spark gibi
Joey Baruch


4

Böyle bir derleyici uyarısı bilmiyorum.

Durumunuzda büyük olasılıkla @Deprecatedek açıklamayı kullanırdım . Metot çağrılarını kesecek, böylece bir şeylerin bittiğini diğerlerine göre belli olacak. Ne olduğuna baktıklarında, 'üretime hazır değil' hakkındaki yorumlarınızı görecek ve AHA'ya gidecekler.


2
yöntem çağrıları yalnızca IDE destekliyorsa üst üste biner.
SinirliWithFormsDesigner

5
Doğru, ancak çoğu insan muhtemelen onu destekleyen IDE'lerden birini kullanacaktır.
c_maker

3

Ben kodu işaretleme standart bir yolu yoktur sanmıyorum WIP, Incompleteböyle, ya da bir şey.

Adında yeni bir kural dışı durum oluşturabilir ClassUnstableExceptionve bunu Class3yapıcıda nasıl kullanmamalarını açıklayan bir iletiyle yükseltebilirsiniz . Bu kötü, çünkü onları sadece çalışma zamanında uyarıyor.

Ayrıca, sınıfı bir şekilde uyumsuz hale getirmeyi deneyebilir ve daha sonra derleyiciyi çalan kod bölümüne bir not ekleyebilir, böylece birisi kodu düzeltmeye giderse umarım o sınıfı neden kullanmamalarının bir açıklamasını görürsünüz. . Bazı IDE'lerin sahip olduğu bazı yarı otomatik "bu sorunu düzelt" aracı kullanıyorlarsa bu çalışmayabilir. Bu da kötü çünkü yapıları kırabilir.

WIP(Düşünebildiğim en yakın şey bu Deprecatedama aynı şey anlamına gelmiyor) adlı bir ek açıklama oluşturabilir ve sınıfı not eklemek için kullanabilirsiniz. Bu muhtemelen biraz daha fazla iş olurdu ve ek açıklamayı ne destekleyebilir?

Son olarak, sadece yorumlara koyabilirsiniz, ancak bu sadece insanlar gerçekten okuduğunda işe yarayacaktır.

DÜZENLE:

Alakalı olabilir: Nasıl özel bir java derleyici uyarı iletisine neden olabilir?


atma istisnası, tutulmanın erişilemez koddan şikayet etmesini sağlar. Herhangi bir çözüm var mı?
Wei Shi

@Usavich: Kodu görmediğimden emin değilim, ama belki de gelecekteki geliştiricilerin kodu kullanmasını önlemeye yardımcı olabilir mi?
SinirliWithFormsDesigner

@Usavich: Yazımda EDIT'e eklediğim bağlantıya bir göz atın, OP'nin özel bir derleyici uyarısı eklemek istediği benzer bir soru. Özel bir "UnstableCode" ek açıklaması eklemenize yardımcı olabilir.
SinirliWithFormsDesigner

3

Neden ilk etapta orada?

Ana hatta kararsız kodu kontrol ettiniz mi? Neden?

Kararsız kod, ana / ana / ana veya ana ana adı ne olursa olsun kontrol edilmemelidir. Bu yüksek risk gelişimi olarak kabul edilir ve bunun yerine ana dalda kontrol etmek yerine üzerinde çalıştığınız kendi dalında tecrit edilmiş olmalıdır.

Sizi (ve ekibinizin liderliğini) Gelişmiş SCM Dallanma Stratejileri'ni okumaya teşvik ediyorum . Özellikle, geliştirme rolüne ve yüksek riskli gelişme olarak kabul edilen şey hakkında söylediklerine dikkat edin:

Genel olarak, her bir yüksek riskli proje için ayrı dallar kullanmayı düşünün. Yüksek riskli projeler, büyük boyutlu, çok sayıda insan, tanıdık konu, yüksek teknik konu, çok sıkı zaman çizgileri, belirsiz teslimat tarihleri, eksik veya geçici gereksinimler ve coğrafi olarak dağıtılmış proje ekipleri ile karakterizedir. Benzer şekilde, her bir sürümde düşük riskli gelişme için tek bir dal belirlemeyi düşünün. [WING98] dahil olmak üzere çeşitli kaynaklar bu amaçla ana hattı kullanmanızı önerir. Bu eylem sürecine başlamadan önce ana hat için yukarıda tartışılan faktörleri göz önünde bulundurun. Ana hat üzerinden koordine eden bir ürün ailesinin birden fazla üyesi olsa bile, düşük risk geliştirme ana hattan farklı politikaya sahip olabilir.

İnsanların kararsız (veya kullanılmayan) kodları ana hatta kontrol etmelerine izin vermek, bu kodu korumaya çalışmakla ilgili gelecekteki geliştirme çabalarını karıştıracağınız anlamına gelir. Temsilcinin bugünden sonuna kadar her dalı ve klonu, birisi "ölü kodunu" söyleyip silene kadar bunu içerecektir.

Bazıları "iyi, eğer bir dalda unutulursa" diyebilir ve bu doğru olsa da, ölü (ve kararsız) kodun ana hatta unutulması, kaldırılana kadar gelecekteki tüm gelişimi karıştırdığı için çok daha kötüdür - ve o zaman daha da unutulur. "/ FooProject / branch / WeisBigIdea" (veya eşdeğeri) olarak adlandırılan güzel bir dal görünür ve gelecekte birlikte çalışılması daha kolaydır - özellikle de bir tür çalışma durumunda.

@Deprecated

İlk şey @Deprecatedek açıklamadır. Bu javadoc'un ötesine geçer ve derleyici uyarılarını verir. şu şekilde tanımlanan javacbir -deprecationbayrak sağlar :

Kullanımdan kaldırılmış bir üye veya sınıfın her kullanımının veya geçersiz kılınmasının bir açıklamasını gösterir. Yok -deprecation, javackullanımdan kaldırılmış üyeleri veya sınıfları kullanan veya geçersiz kılan kaynak dosyalarının bir özetini gösterir. -deprecation kısaca -Xlint:deprecation.

Belirtildiği gibi, bu standart derleyici uyarılarının ötesine geçer.

Birçok IDE'de, kullanımdan kaldırılan yöntemler ve değerler üstü çizili olarak gösterilir:

foo.bar();

Ve şöyle çıktı üretir:

$ javac -Xlint:all Foo.java Bar.java
Bar.java:2: warning: [deprecation] Foo in unnamed package has been deprecated
interface Bar extends Foo { }
                      ^

Yapı yapınıza bağlı olarak, yapıyı bozan uyarılar olabilir. Bu , derlemeyi yalnızca sınıflarınızdan biri kullanıldıysa bozar (sadece derlenmişse değil).

@CustomAnnotation

Buna birçok yaklaşım var. Örneğin, bu ek açıklama ile ilgili bir şey kullanıldığında derleme zamanında bir uyarı başlatan bir ek açıklama işlemcisi sağlayan Hafif javac @ Uyarı ek açıklaması ( özel ek açıklama işlemcileri üzerinde bir netbeans öğreticisi böylece sahneler).

Oracle , Java'nın Meta Verilerinden En İyi Bölüm 2: Özel Ek Açıklamalardan En İyi@Unfinished Şekilde Yararlanma konusunda bir ek açıklama için özel ek açıklamaların kullanılmasına bir örnek bile açıklar .

İle AnnotationProcessor , derleme zamanında rasgele kod çalıştırabilir. Ne yapmak istediğinize karar vermek size kalmış. Uyar, bir şey kullanıldığında yapıyı kır. Bu tür kodların nasıl yazılacağı konusunda web üzerinde çok sayıda öğretici var. Derlendiğinde bir hata oluşturmak isteyip istemediğiniz (bu sinir bozucu olacak ve silinmesine yol açacaktır) veya kullanıldığında (yazmak için biraz daha karmaşık).

Tüm bunların, ek açıklama işlemcisini kullanmak için derlemeleri değiştirmeyi gerektirdiğini unutmayın.


2

Sen olabilir tanıtmak derleme zamanı açıklama işleme ancak bu onların derleme işlemi ayarlamak için takımın tüm üyeleri uygulamak olacaktır.

Ancak tüm süreci biraz kafa karıştırıcı buluyorum. Kararsız bir API, sürüm kontrol sisteminizde bir şube oluşturarak açıkça ayrılmalıdır. Eğer gerçekten kod tabanının geri kalanında olması gerekiyorsa, dengesiz olarak belgelenmiştir ve yine de kullanılma sorunu gerçekten teknik değil, organizasyon ve iletişim içinde yatmaktadır. Evet, teknik doğrulama (ek açıklama işleme gibi) uygulayabilirsiniz, ancak bu sorunu çözmez - sadece başka bir seviyeye taşıyın.

Benim tavsiyem şudur: Kod tabanını farklı dallara koyarak ayıramazsanız, insanlarla konuşun ve neden API'yı kullanmamaları gerektiğini açıklayın .


0

Tüm eksik sınıfları "NOTCOMPLETE" gibi belirgin bir alt pakete taşıyabilir misiniz? Biraz kesmek ama yeterince görünür olabilir.

(Hepsi aynı pakette değilse, altındaki paket yapısını yeniden oluşturabilirsiniz.)


0

Kodda bunu yapmak için gerçekten iyi bir yol olduğunu bilmiyorum. Bir adım geri at:

Biri sınıf ve diğeri olmadan tüm projenin iki kopyasını oluşturun. Sınıfsız sürümü kararlı bir kod tabanı, üretim sürümü için hazır ve gelecekteki bir sürüm için geliştirme olarak sınıflı sürümü işaretleyin. Bu sınıftan önce neler olması gerektiğini belgelemek üretim kalitesi olarak kabul edilebilir.

İdeal olarak, bunu seçtiğiniz kaynak kontrol çözümünüzdeki dalları kullanarak yapmalısınız. Biraz hile yapmanız gerekebilir, çünkü böyle bir dallanma stratejisi kullanmıyorsunuz gibi görünüyor. Yeni sınıfı dikkatlice kaldırın, onsuz bir sürümü kontrol edin ve bazı regresyon testleri yapın. Kararlı olduğundan memnun olduğunuzda, bu düzeltmeyi etiketleyebilir, etiketten bir geliştirme dalı oluşturabilir ve ardından sınıfı geliştirme dalına geri ekleyebilirsiniz.


0

Sınıf soyut yapmak ve uygun bir şekilde yorum yapmayı tercih ediyorum - bu şekilde, kod hala referans için orada, ama bunu başlatmak için çalışan herkese iyi şanslar :)


-1

Derleyicinin çözemediği bir bağımlılık yapmaya ne dersiniz? Sadece ekle:

bunu içe aktarın. not.done.yet.do.not.use.it;

Başa. Kullanıcılar bununla derleyemez.

Sınıfı test etmek istiyorsanız, o adla bir paket / sınıf oluşturun (veya "experimental.danger" gibi daha basit bir paket kullanın) ve yeni kodu test edebilirsiniz.


1
Derleme bunu kullanmasam bile başarısız olacak ... kötü fikir ...
Silviu Burcea
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.