Виправлення помилки під час роботи над іншою частиною кодової бази


19

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

Що ти робиш у цій ситуації?

  1. Виправте помилку та виконайте її разом із вашою поточною роботою
  2. Збережіть свою поточну роботу в іншому місці, виправте помилку в окремій комісії, а потім продовжте роботу [1]
  3. Продовжуйте те, що ви повинні робити, введіть код (навіть якщо він є розбиває збірку не вдалося виконати деякі тести), а потім виправити помилку (і збірка зробити тести пройти) в окремий комітет

[1] На практиці це означатиме: клонуйте оригінальний сховище в іншому місці, виправте помилку, виконайте / натисніть на зміни, перетягніть фіксацію у сховище, над яким ви працюєте, об'єднайте зміни та продовжуйте свою роботу.

Редагувати: Я змінив номер три, щоб відобразити те, що я насправді мав на увазі.


2
Чому б не здійснити як виправлення помилки, так і зміну однієї транзакції? Це досить звичайно і чисто. Ви, звичайно, повинні розміщувати відповідні коментарі.

@Pierre, це номер 1. Я думаю, що міг би вибрати краще слово, ніж silently.
imgx64

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

2
@Pierre 303 О людино, така погана практика! Розподіліть свої зобов’язання на детальні.
альтернатива

@mathepic: коли зміна стосується лише однієї задачі, так, але коли вона впливає на декілька завдань, просто неможливо без порушення збірки

Відповіді:


15

Я зробив 1 і 2, і врешті-решт, я думаю, що я віддаю перевагу №2. Це дозволяє збільшити видимість виправлення помилок, що може бути важливим для QA / нотаток випуску / інших розробників.

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


11

Я взагалі йду за №2. Це робить сховище більш чистим і робить журнали більш зрозумілими. Я ненавиджу це, коли інші розробники, з якими я працюю, здійснюють 15 різних виправлень, функцій та рефактори, які виконуються в одній програмі

Крім того, залежно від того, як ваша команда здійснює відстеження дефектів, вам може знадобитися здійснити пошук репортажу дефектів, щоб переконатися, що якщо дефект, який ви виправляєте, є там, ви позначаєте елемент як повний. Або вам може знадобитися створити новий елемент і позначити його завершеним, щоб система дефектів та репо-код коду збігалися.


7

Я роблю №2. Використання таких інструментів, як git, робить неприємним поділ на декілька комітів. Якщо ви не можете переконати вашу команду перейти до більш сучасних інструментів, git-svn надасть вам гідну частину того, що ви використали б для вирішення цієї проблеми. Ця публікація в блозі дає хороший огляд робочого процесу, який ви намагаєтеся вирішити: Річ про Git


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

@ imgx64: Я не знаю, чи має він еквівалент індексу. Це вбивча функція git IMO
Daenyth

Читаючи коментарі в цьому дописі, Mercurial має еквівалентне розширення. shelveРозширення робить те , що мені потрібно.
imgx64

@ imgx64 Полиця може бути корисною, так. Але я вважаю, що розширення Record є більш підходящим. Я використовую його лише через графічний інтерфейс TortoiseHg (ви можете двічі клацнути по різному, щоб видалити / додати його до комірок).
barjak

3

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

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

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

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

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


2
Хоча я згоден, це працює не у всіх ситуаціях. "Помилка в іншій частині коду" може бути в батьківському класі або навіть в іншому методі в тому ж класі. Ви не можете розділити їх у різних бібліотеках.
imgx64

@img: Звичайно, але якщо "інша частина" кодової бази знаходиться в такій близькості до того, над чим ви працюєте, то, ймовірно, це навіть не виправдовує такої великої уваги - просто виправте це! : P
Aaronaught

1

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


3
За допомогою Git ви можете розділити кілька змін у одному файлі на декілька комітетів - мені часто не вистачає цього під час роботи над SVN-проектами.
Пітер Бауфтон

1

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


1

Коротка відповідь: №2. Ви дійсно хочете, щоб цей виправлення (із його приміткою у вашому трекері!) Позначено в історії вашої версії як окрема сутність.

Більш довга відповідь:

  • Натрапляйте на помилку
  • Напишіть тест або більше, де демонструється помилка
  • Зробіть пробний тест
  • Фіксувати тільки що зміна і його випробування ( git add --interactiveабо darcs record -iчи як ваш VCS робить це) (*)
  • Поверніться до того, що я робив.

(*) У CVS (ні, справді) у мене іноді перевіряється чисте дерево, а також копія, над якою я працюю. Тоді я використовую злиття - winmerge, в моєму випадку - щоб витягнути лише виправлення в чисте дерево, щоб я міг зробити його окремо. (Інший варіант - перейменувати змінені файли cvs updateта об'єднати. Коли ви здійснили зміну, видаліть файл та перейменуйте переміщені файли на їх початкові назви.)

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


1

Я виправляю помилку і роблю окремі коміти , по одному для кожного виправлення / функції.

Здебільшого зміни не в одному файлі, тому розділити коміти легко. Якщо зміни є в одному файлі, я використовую TortoiseHg (мекурійний інтерфейс GUI), щоб вибрати саме ті, які я хочу здійснити (я думаю, що це можливо зробити в командному рядку з розширенням Record , але це менш зручно ).

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


0

Я зазвичай роблю №2. Збереження моєї поточної роботи в іншому місці: це зазвичай добре працює, створюючи виправлення. Також деякі IDE (IntelliJ) дозволяють зберігати зміни, саме це: зберегти поточну роботу в іншому місці.


0

Що я роблю, залежить від того, чи справді помилка знаходиться в іншій частині. Якщо це так, то його перевірка не залежить від моєї половини виконаних змін. Я вношу зміни, будую цю іншу частину, щоб бути впевненою, що я не допустив якоїсь тривіальної помилки, перевіряю її (можливо, роблячи все, що це заважало мені робити) і перевіряю це, пояснюючи, що відбувається. Часто я буду виготовляти робочий предмет для нього, а після реєстрації / вирішення призначу WI тестером. Потім я повертаюся до того, що робив.

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

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


0

Ми робимо №1. # 2 звучить добре, але я не можу сказати, що у нас виникли проблеми з №1, які вирішили б №2.

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

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