2016-03-29 15 views
2

私はfoobarと呼ばれるライブラリパッケージを持っているとします。クライアントコードを壊さずに大きなパッケージを分割するにはどうすればよいですか?

時間の経過とともに、大きくて重くなりました。ほとんどのクライアントは、どちらか一方だけを使用する必要があります -

幸いにも、それは分離可能だ、私は2つの別々のパッケージfooのバーにその機能を分割して管理します。

私のライブラリは、多くのクライアントによってすでに使用されているので、互換性のために私はまだ両方fooのバーで見つかった現在の機能へのプロキシとしてfoobarにパッケージを維持したいです。

Goでこれを達成するにはどうすればよいですか?頭に浮かぶ

一つの方法は、FOOバーに各構造体/関数のfoobarににエイリアスを作成することです。 FOOF()バーB()が定義されて定義されている場合ので、私はfoobarにでなければなりません:

var (
    F = foo.F 
    B = bar.B 
) 

しかし、私は簡単に/クリーンな方法のために期待しています。

答えて

6

エイリアスパッケージの作成は唯一の方法です。 しかし、あなたの試みはおそらくうまくいかないでしょう:それは関数や変数、constではしか動作しますが、型では動作しません。タイプについては、タイプをfoobarに複製する必要があります。

私はこれをしません。ちょうどバージョン1の周りにfoobarを持っていて、fooとbar(おそらくはバージョン2で直接)で新たに始まります。

+0

ありがとう、私はそれを恐れていました。残念ながら、これはソフトウェアが成長するにつれて自然現象であり、新しいバージョン(APIを壊す)を出すことは、私の場合を含めて多くの場合、コストがかかるソリューションです。 – Jan

+0

は 'MyType foo.MyType'をタイプせず、' type OtherType bar.OtherType'は主に動作しますか?私はそれがメソッドとひどく干渉するのを見ることができます。 Hm。 – Vatine

+0

@Vatineはい:すべてのメソッドが失われます。さらに、タイプスイッチとタイプアサートが失敗し、反射が壊れる可能性があります。そうです:いいえ、これは「ほとんど仕事」ではありません。 – Volker

関連する問題