Наразі я керую бібліотекою, яка має багато публічного використання, і у мене виникло питання про семантичну версію . Я хочу переробити одну досить важливу частину бібліотеки, яка реалізована неправильно - і завжди була реалізована неправильно. Але це буде означати зміни до публічного API, що є важливим рішенням.
Зміна, яку я хочу внести, обертається навколо того, як використовуються ітератори. Наразі користувачі повинні це зробити:
while ($element = $iterator->next()) {
// ...
}
Що невірно, принаймні в рідному інтерфейсі Iterator PHP . Я хочу замінити це:
while ($iterator->valid()) {
$element = $iterator->current();
// ...
$iterator->next();
}
що є аналогом:
foreach ($iterator as $element) {
// ...
}
Якщо ви подивитесь на посібник Тома про семантичну версію, він чітко зазначає, що будь-які зміни в загальнодоступному API (тобто ті, які не є сумісними назад), повинні виправдати основний випуск. Тож бібліотека перескочила б з 1,7,3 до 2,0,0, що, на мій погляд, занадто далеко. Ми говоримо лише про одну фіксовану функцію.
У мене є плани зрештою випустити 2.0.0, але я подумав, що це відбулося, коли ви повністю переписали бібліотеку та впровадили численні зміни публічного API. Чи є введення цього рефакторингу основним випуском версії? Я дійсно не бачу, як це відбувається - мені комфортніше, випускаючи його як 1.8.0 або 1.7.4. Хтось має поради?
next()
метод використовується для отримання поточного елемента І переміщення внутрішнього вказівника вперед. Що неправильно. next()
повинен перемістити вказівник, і current()
він використовується для отримання ...
next()
лише того, що є рухом покажчика, це дійсно не порушує сумісність