Як позначити клас на розробці в Java


12

Я працюю над проектом стажування, але мені потрібно піти, перш ніж все закінчити.

У мене є 1 клас, який недостатньо стабільний для виробництва. Я хочу відзначити / позначити цей клас, щоб інші люди випадково не використовували його у виробництві. Я вже помістив повідомлення в Javadoc, але цього здається недостатньо. Якась помилка чи попередження компілятора було б краще.

Код організований так:

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

Якби був єдиний заводський клас, який викликає ці класи у публічних методах, я міг би встановити метод class3як private. Однак API НЕ піддається такому впливу. Користувачі будуть безпосередньо використовувати цей клас, наприклад new Class1();, але я не можу зробити клас вищого рівня приватним. Яка найкраща практика вирішити цю ситуацію?


1
Що ви маєте на увазі під "API не піддається впливу методів?" Чи призначений цей клас використовувати через API Reflection?
Том Г

5
Помилка компілятора? Чому б просто не кинути виняток у конструкторі?
Mchl

Вибачте за непорозуміння. Я відредагував своє повідомлення.
Вей Ши


1
Ви не можете зробити клас приватним, але ви можете зробити його конструктор приватним.
Пітер Тейлор

Відповіді:


15

Чому б просто не перевірити всі нестабільні класи в іншій гілці системи управління версіями?


2
Мені здається, що це "приховає" код. Що робити, якщо код майже робить те, що потрібно іншим, щоб зробити деякі незначні зміни. Якщо ви помістите його у гілку, вони, можливо, ніколи цього не побачать і просто повторно реалізують все.
c_maker

3
@c_maker: Повідомлення іншим гілки існує, і те, що в ній, має бути частиною того, що передається, коли він виїжджає.
Blrfl

2
@Birlf Якщо він переживає, що інші не побачать пояснення коду JavaDoc, який вони використовують, я сумніваюся, що вони будуть шукати іншу документацію, яку він виробляє.
KeithB

Мене хвилює те, що ця функція все ще розвивається, але майстер scrum вирішив її відмінити з будь-якої причини (мораторій, який блокує тестування E2E, в нашому випадку). Якщо ми не приєднаємося до нього до майстра, може бути багато спільної роботи в дорозі. Ми щойно зробили c`tor приватним і анотували клас @Experimental, як у Spark
Joey Baruch

11

Якщо ви правильно прокоментували клас, ви можете позначити біти незавершеного функціоналу як "застарілий", або ж прокоментувати кишки методу і поставити а throw new UnsupportedOperationException();.

Див. Чи є щось на зразок NotImplementedException .NET у Java? для деталей.


2
Це дефакто-спосіб поводження з
хиткою

4

Я не знаю такого попередження компілятора.

У вашій ситуації я б, мабуть, використовував @Deprecatedанотацію. Він перекреслить виклики методів, тому для інших буде очевидно, що щось відбувається. Коли вони подивляться на те, що відбувається, вони побачать ваші коментарі про "не готове виробництво" і перейдуть до AHA.


2
виклики методу перекреслюються лише в тому випадку, якщо IDE підтримує його.
FrustratedWithFormsDesigner

5
Правда, але більшість людей, ймовірно, використовуватимуть один із тих IDE, які його підтримують.
c_maker

3

Я не думаю , що є стандартний спосіб маркування коди , як WIP, Incompleteабо що - то в цьому роді.

Ви можете створити новий виняток з назвою, ClassUnstableExceptionа потім підняти його в Class3конструкторі з повідомленням, яке пояснює, як вони не повинні його використовувати. Це погано, адже це лише попереджає їх під час виконання.

Ви також можете спробувати зробити клас інкапілюючим яким-небудь чином, а потім додати примітку до розділу коду, який відключає компілятор, щоб, якщо хтось піде виправити код, він, сподіваємось, побачить пояснення, чому вони не повинні використовувати цей клас . Це може не спрацювати, якщо вони використовують якийсь напівавтоматичний інструмент "виправити цю проблему", який мають деякі ІДЕ. Це також погано, оскільки це може зламати нарощування.

Ви можете створити анотацію з назвою WIP(оскільки найближче, про що я можу придумати, Deprecatedале це насправді не означає те саме) і використовувати її для анотування класу. Це, мабуть, буде трохи більше роботи, і що підтримувало б анотацію?

Нарешті, ви можете просто помістити це в коментарі, але це спрацює лише в тому випадку, якщо люди насправді їх прочитають .

Редагувати:

Це може бути актуально: Як навмисно викликати спеціальне попереджувальне повідомлення компілятора Java?


Виняток кидка змушує затемнення скаржитися на недосяжний код. Будь-яке вирішення?
Вей Ши

@Usavich: Не впевнений, оскільки коду я не бачив, але, можливо, це також може допомогти запобігти майбутнім розробникам використовувати цей код?
FrustratedWithFormsDesigner

@Usavich: Подивіться на посилання, яке я додав у своїй публікації EDIT, це аналогічне запитання, де ОП хотіла додати попередження про компілятор. Може допомогти вам додати спеціальну примітку "UnstableCode".
FrustratedWithFormsDesigner

3

Чому вона там в першу чергу?

Ви перевірили нестабільний код в основній лінії? Чому?

Нестабільний код не слід перевіряти в trunk / main / master або як би не було головне ім'я магістралі. Це вважається розвитком високого ризику, і натомість його слід було б виділити у власній галузі, над якою ви працювали, а не перевіряли її на основну.

Я настійно закликаю вас (та керівництво вашої команди) ознайомитись із розширеними стратегіями розгалуження SCM . Зокрема, зверніть увагу на роль розвитку та те, що вона говорить про те, що вважається розвитком високого ризику:

Загалом, подумайте про використання окремих відділень для кожного проекту з високим ризиком. Проекти з високим рівнем ризику характеризуються великим розміром, великою кількістю людей, незнайомою темою, високо технічною тематикою, дуже чіткими строками, невизначеними термінами доставки, неповними або мінливими вимогами та географічно розподіленими командами проектів. Аналогічно розглянемо призначення однієї гілки для розвитку низького ризику в кожному випуску. Кілька джерел, включаючи [WING98], рекомендують використовувати основну лінію для цієї мети. Розгляньте фактори, обговорені вище для основної лінії, перш ніж приступити до цього курсу дій. Розвиток із низьким рівнем ризику може мати різну політику від основної лінії, навіть якщо у вас є кілька членів сімейства продуктів, що координуються через основну лінію.

Дозволити людям перевіряти нестабільний (або невикористаний) код на основний, це означає, що ви будете плутати майбутні зусилля з розробки щодо спроби зберегти цей код. Кожна гілка та клон представника відтепер до кінця часу міститиме це, доки хтось не скаже "свій мертвий код" та не видалить його.

Є такі, що кажуть "добре, якщо його у гілці він забуде", і хоча це може бути правдою, забувши мертвий (і нестабільний) код у магістралі в багато разів гірше, оскільки він плутає всю подальшу розробку, поки не буде видалений - і то вона ще більше забута. Добре названа гілка "/ fooProject / branch / WeisBigIdea" (або еквівалент) є видимою і легшою для роботи в майбутньому - особливо якщо це працює.

@Deprecated

Перше - @Deprecatedанотація. Це виходить за рамки javadoc і виказує попередження компілятора. javacнадає -deprecationпрапор, який описується як:

Покажіть опис кожного використання або перестановки застарілого члена або класу. Без -deprecation, javacпоказує резюме вихідних файлів, які використовують або переосмислюють застарілі члени або класи. -визначення є скороченим для -Xlint:deprecation.

Як зазначалося, це перевищує стандартні попередження компілятора.

У багатьох IDE застарілі методи та значення показані чітко:

foo.bar();

І дало б випуск:

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

Залежно від вашої структури збірки, у вас можуть з’явитися попередження про розрив збірки. Це зірве збірку лише в тому випадку, якщо один із ваших класів був використаний (не, якщо він просто зібраний у).

@CustomAnnotation

До цього існує багато підходів. Наприклад, полегшена анотація javac @Warning, яка забезпечує процесор анотацій, який знімає попередження під час компіляції, коли використовується щось із цією приміткою ( підручник з мережевих файлів на користувацьких процесорах анотацій, щоб ви могли отримати уявлення про те, що відбувається позаду сцени).

Oracle навіть описує приклад використання користувальницьких анотацій для @Unfinishedанотації при використанні метаданих Java, частина 2: Спеціальні анотації .

За допомогою AnnotationProcessor ви можете запускати довільний код під час компіляції. Ви самі вирішуєте, що ви хочете робити. Попереджайте, розривайте збірку, коли щось використовується. В Інтернеті є численні підручники, як написати такий код. Незалежно від того, чи хочете ви створити помилку під час її компіляції (це буде дратувати і призведе до її видалення) або якщо вона використовується (досить складніше написати).

Зауважте, що все це означає зміну складок для фактичного використання процесора анотацій.


2

Ви можете ввести обробку анотацій за час компіляції, але це змусить усіх членів команди скорегувати процес компіляції.

Однак я вважаю весь процес дещо заплутаним. Нестабільний API повинен бути чітко відокремлений, створивши гілку у вашій системі управління версіями. Якщо це дійсно має бути в решті кодової бази, було зафіксовано як нестабільне, і все-таки звикнути, проблема насправді не є технічною, а лежить в організації та комунікації. Так, ви можете ввести технічну перевірку (наприклад, обробку анотацій), але це не вирішить проблему - просто перенесіть її на інший рівень.

Тому моя рекомендація: Якщо ви не можете відокремити базу коду, помістивши її в різні гілки, то поговоріть з людьми та поясніть їм, чому вони не повинні використовувати API.


0

Чи можете ви перемістити всі незавершені класи в підпакет, названий чимось очевидним, як "NOTCOMPLETE"? Це трохи хак, але може бути видно досить.

(Якщо вони не всі в одному пакеті, ви можете відтворити структуру пакета під ним.)


0

Я не знаю, що дійсно є хороший спосіб зробити це в коді. Зробіть крок назад:

Створіть дві копії всього проекту, одну з класом, а одну без. Позначте версію без класу як стабільну базу коду, готову до випуску, а версію з класом як розробку для майбутнього випуску. Документуйте, що має відбутися перед цим класом, можна вважати якісним виробництвом.

В ідеалі вам слід зробити це, використовуючи гілки в обраному вами рішенні управління. Можливо, вам доведеться трохи обдурити, оскільки це здається, що ви не використовували таку стратегію розгалуження. Акуратно видаліть новий клас, перевірте версію без нього та зробіть тест регресії. Коли ви впевнені, що він стабільний, ви можете помітити цю версію, створити гілку розробки з тегу, а потім додати клас назад у гілку розвитку.


0

Я б вирішив зробити клас абстрактним і коментувати відповідним чином - таким чином, код все ще є для довідки, але удачі всім, хто намагається його інстанціювати :)


-1

А як же зробити залежність, яку компілятор не може вирішити? Просто додайте:

імпортувати this.is.not.done.yet.do.not.use.it;

До вершини. Користувачі не зможуть компілювати його.

Якщо ви хочете перевірити клас, просто створіть пакунок / клас з таким ім'ям (або скористайтеся більш простим, як-от "експериментальний.данок"), і ви можете протестувати новий код.


1
Компіляція вийде з ладу, навіть якщо я не використовую її ... погана ідея ...
Silviu Burcea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.