重要なバグを修正する際のセマンティックバージョニング


18

私は現在、多くのパブリックな用途があるライブラリを管理しており、セマンティックバージョン管理について質問がありました。正しく実装されていないライブラリのかなり重要な部分をリファクタリングしたい-そして常に正しく実装されていない。ただし、これを行うと、パブリックAPIが変更されることになり、これは大きな決断です。

私が行いたい変更は、イテレータの使用方法を中心に展開します。現在、ユーザーはこれを行う必要があります。

while ($element = $iterator->next()) {
   // ...
}

少なくともPHPのネイティブIteratorインターフェイスでは、これは正しくありません。これに置き換えたい:

while ($iterator->valid()) {
   $element = $iterator->current();
   // ...
   $iterator->next();
}

これは次のようなものです:

foreach ($iterator as $element) {
    // ...
}

トムのセマンティックバージョニングのガイドを見ると、パブリックAPIへの変更(つまり、下位互換性のないもの)はメジャーリリースを正当化すべきであると明確に述べています。したがって、ライブラリは1.7.3から2.0.0にジャンプしますが、これは私にとってはあまりにも大きな一歩です。修正される機能は1つだけです。

最終的に2.0.0をリリースする計画はありますが、ライブラリを完全に書き直し、多数のパブリックAPIの変更を実装たときだと思いました。このリファクタリングの導入は、メジャーバージョンリリースを保証しますか?私は本当にそれがどのように見えるかわかりません-私は1.8.0または1.7.4としてそれをリリースすることをより快適に感じます。誰かアドバイスがありますか?


後方互換性を維持できない理由は何ですか?
ムーヴィシエル

現時点では、このnext()メソッドを使用して現在の要素を取得し、内部ポインタを前方に移動します。それは間違っています。next()ポインターを移動する必要があり、current()取得に使用されます
...-hohner

6
そのため、新しいバージョンnext()では、ポインターを移動するだけの戻り値を気にする必要はありません。これは互換性を実際に壊しません
ラチェットフリーク

回答:


29

セマンティックバージョニングを作成したくないため、「バージョニングをサポートする広告」を作成したいので、ためらいます。バージョン番号「2.0」は、APIを変更したのではなく、ライブラリに新しいクールな機能がたくさんあることを世界に知らせるものです。大丈夫です(多くのソフトウェア会社や開発者がそうしています)。私見には、次のオプションがあります。

  • セマンティックバージョニングに固執し、バージョン番号を2.0.0に変更する必要があるという事実に耐えます
  • バージョン管理スキームを4つの数字に変更します。「1.1.7.3」が現在のバージョンであり、「1.2.0.0」がAPIの変更後の次のバージョン、「2.0.0.0」が「完全に新しい2.x製品ファミリー」の最初のバージョンです。
  • 修正に下位互換性を持たせます(したがって、の機能を変更せずnextに、validおよびcurrent関数を追加するだけです)。その後、次のバージョン番号として「1.8.0」を使用できます。の動作を変更することnextが本当に重要だと思う場合は、2.0.0で変更してください。

最後のオプションが完璧な解決策である限り、あなたはnext()それがしていることをやり続けるように頼むことはできません。機能を正しく実装するには、別の方法で行う必要があります。したがって、下位互換性を持たせると、新しい機能/修正も間違ってしまい、変更の全体のポイントが損なわれます。
hohner

2
3番目の箇条書き(修正に下位互換性を持たせる)で行うより広範な提案は、検討するのに適しています。この特定のケースでは機能しない場合がありますが、全体的な手法は検討する価値があります。機能はより複雑になりますが、これは実行可能なルートかもしれません。

皆さんに感謝します。2つを受け入れることができれば、私はそうします。最終next()的に、すべての新しい機能を実行するための新しいメソッドに加えて、下位互換性を保つために必要なものをハッキングしました。このような新しい機能を損なう必要があるのはちょっと恐ろしいことですが、ほらほら。
-hohner

10
@hohner:次に、古い動作を非推奨として文書化するときが来たので、2.0.0で削除できます。
ヤンファブリ

7

セマンティックバージョニングのトムのガイドに固執します。

パブリックAPIへの大幅な変更は、次の2つのポイントのいずれかで行う必要あります。

  1. 決して
  2. メジャーリリースアップデートで

ところで、私の投票は最初のものです。しかし、私はそれが些細なことだけに適していることを認めます。

問題は、後方互換性を維持し、APIの以前のユーザーに支障をきたさないようにすることです。

本質的に、変更を知らないユーザーのためにインデックス作成エラーを作成しています。このような変更を強制すると、すべてのユーザーが次のことを強制されます。

  1. 新しいアプローチを使用するように修正をコーディングする
  2. 修正を検証し、それが何も壊さないことを確認します
  3. 製品の新しいリリースをエンドユーザーに出荷する

特に、このような変更を検証するためにテストケースを配置しているプロジェクトが少ないことを考慮すると、多くの労力がかかる可能性があります。また、インストールを更新する必要があるユーザーからのダウンストリームユーザーの数を考慮すると、作業量が複雑になります。

これほど小さいものについては、気にせずに手放します。
それが本当にあなたを悩ませている場合(明らかにそうするか、あなたが尋ねなかったでしょう)、私は次のことをします。

  1. コードツリーにv2.0.0ブランチを作成します
  2. この変更であるv2.0.0ブランチへの最初の貢献をします
  3. Release Notes変更が近づいていることを放送する前にプレビューを送信する

そして、バージョン番号を新しいメジャーリリースにアップグレードすることを正当化する他のものを蓄積するのに時間がかかるので、しばらくお待ちください。高度な通知(パート3)を使用すると、エンドユーザーからフィードバックを受信して​​、変更がどの程度の影響を与えるかを知ることができます。


別の解決策は、希望する方法で動作する新しい関数を追加することです。

その場合、修正を提供するためにfoo()作成fooCorrect()しますが、後方互換性も完全に保持します。そして、ある時点でfoo()、使用しないことを他の人に知らせるために非推奨にすることができます。

そこでの課題は、更新が必要な他の何かを見つけることfooCorrect()あり、最終的にはfooCorrectedCorrect()か、他のいくつかの愚かなナンセンス。

本当に欲しいなら今すぐ修正しは、この代替アプローチがおそらく最善の方法です。APIの操作が難しくなるため、この方法で多くの追加関数を作成することに注意し、注意してください。そして、その認識は、これらのタイプの最悪の問題を防ぐのに十分かもしれません。

しかし、これは小さな何かを考慮するための「最も悪い」アプローチかもしれません。


仰るとおりです。私が直面している問題は、v2.0.0のライブラリを完全に書き直したいということです(修正が必要なこれらの問題がたくさんあるため)。そのため、イテレータのような小さな変更がこの大きな変更の基礎を形成するのは望ましくありません。だから私の選択肢は、このバグを無視するか、バグを修正して新しいメジャーバージョンに入れるかです。
-hohner

@hohner-新しい関数を作成する代替アプローチを提供するために回答を更新しました。似たような名前の新しい多くの関数は、API自体を変更するのとほとんど同じくらい悪いことに注意してください。

3
@hohner:一貫して間違っている>この場合、一貫して正しくない。振る舞いは依然として機能しますが、それは慣用的なものではありません。この変更を行うと、クライアントコードが破壊されることを考慮してください。警告なしでこれを行うことは歓迎されません。
-Phoshi

@ GlenH7この場合、別の名前のメソッドを使用しても機能しません。PHPのネイティブイテレータは、これらのメソッドに依存しています(つまりでnext()はありませんnextCorrect())。next()を変更して下位互換性があり、かつIteratorインターフェースの実装時に機能するかどうかを確認します。
-hohner

1
@Phoshiあなたがスポットです-私は今完全に同意します。今は不可能をコーディングしようとする時です:D
hohner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.