私が質問しようとしていることの良い例は、Facebookの新しいタイムライン機能です。当初、タイムラインへのアクセスを許可されたのは一部の人だけでした。機能の動作がより強固になり、バグが修正されると、追加のユーザーがこの機能にアクセスできるようになりました。後日、大規模なユーザーグループがこの機能へのアクセスを許可され、現在はすべてのユーザーがその機能を利用できるようになっています。開発チームはこのタイプの機能の展開をどのように管理しますか?
私は、構成設定を使用して、何かがテスト中または本番環境にある場合に、構成ファイルとコード内の条件付きifステートメントを介してアクセスを選択的に制御するというアイデアを試しました。これは単純な機能では問題ありませんが、より大きな機能セットでこれを実装しようとすると、管理できなくなると思います。
この方法で機能の展開を管理する最良の方法は何でしょうか?
開発チームはこのタイプの機能の展開をどのように管理しますか?
Facebookのようなシステムは主にデータベースによって駆動されていることは容易に推測できます。すべてのユーザーデータは明らかにデータベースに保存されており、ユーザーのデータをレンダリングする方法に関する情報が含まれている可能性があります。 Facebookのデータベースがどのように設定されているかを正確に知ることは不可能ですが、タイムラインのような機能は、データベース内のユーザーを定期的に選択し、いくつかの基準に基づいて値を変更することにより、段階的にユーザーに展開される場合があります( s)一部のフィールドの。
たとえば、_timeline_status
_、offered
、preview
、public
などの値を持つ_not offered
_などのフィールドがユーザーテーブルにある可能性があります。 。それだけに基づいて、Facebookのシステムはユーザーの情報ページをレンダリングする方法を決定できます。次に、FBチームは、ユーザーのグループを選択してそのフィールドの値を変更することにより、タイムライン機能を試すことができます。
実際には、それよりも少し複雑だと思いますが、基本的な考え方は、ユーザーアカウントは単なるデータであり、そのデータの一部で利用可能な機能を決定できるということです。新しい機能の展開は、データベース内のユーザーレコードを更新するだけです。
...そしてコード内の条件付きifステートメント。
ええ、それはそれをするための間違った方法です。機能Xが何であれ、それが構成可能であれば、何かを拡張または置き換える必要があります。コードでそれを行います。たとえば、FBのものは次のようなものになる可能性があります。
class UserPageView;
class HatedTimelineView : UserPageView;
class OldViewEveryoneLikes : UserPageView;
次に、構成に基づいてユーザーページにアクセスするときにUserPageViewオブジェクトを作成するファクトリを構築します。そのビューをアクティブにします。愚かな枝はありません。
誰かが一度変更するように頼んだ場合、彼らは再びそれを要求するので、あなたはそれをこのようにしたいのです。さらに、彼らは別のものを変更するように求めます。特殊なケースでアーキテクチャをなぞり、至る所にあると、機能が豊富で成熟した製品ではなく、手に負えない、カビの生えたスパゲッティの巨大なボウルができます。
この機能は、水サイトの管理機能と同じように考えてください。
ページを読み込んでいるときに、ユーザーがその機能に対して適切な権限を持っているかどうかを確認してください。
Facebookは、新機能を展開するときに位置情報に基づくアプローチを使用しているようです。これは、ユーザーのIPアドレスを調べて場所を見つけるのと同じくらい簡単かもしれません。