3

私はWebアプリケーションを書いています(Pythonで、それは問題ではありません)。機能の 1 つは、人々が物事にコメントを残すことができることです。基本的に次のようなコメント用のクラスがあります。

class Comment:
    user = ...
    # other stuff

user別のクラスのインスタンスです。

class User:
    name = ...
    # other stuff

そしてもちろん、私のテンプレートには、

<div>${comment.user.name}</div>

問題: たとえば、人々が匿名でコメントを投稿できるようにするとします。その場合comment.userNone(未定義)であり、もちろんアクセスするcomment.user.nameとエラーが発生します。それに対処する最善の方法は何ですか?次の 3 つの可能性があります。

  • テンプレートで条件を使用してそのケースをテストし、別のものを表示します。匿名のコメントの表示方法を、たとえば「投稿者...」ではなく「匿名で投稿」に変更できるため、これは最も用途の広いソリューションですが、テンプレートは気にせずに表示する必要があるとよく言われます。そのようなロジックは含まれません。また、他の人が同じアプリケーション用の別のテンプレートを作成することになるかもしれません。私は、テンプレート作成者のために物事をできるだけ簡単にする必要があると感じています。
  • 実際のユーザーが定義されていない場合にダミーのユーザー オブジェクトを返す aのuserプロパティのアクセサー メソッドを実装します。Commentこのダミー オブジェクトには、user.name = 'Anonymous'またはそのようなものがあるため、テンプレートはそれにアクセスして、その名前をエラーなしで出力できます。
  • user.name = Anonymous(またはそのような)ユーザーに対応する実際のレコードをデータベースに入れ、誰もログインしていないときに投稿されたコメントにそのユーザーを割り当てるだけです。このように動作する実世界のシステムを見たことがあります。(phpBB?)

これらのシステム (または他のソリューション) のどれが最適かについて、この種のシステムを作成する人々の間で広く知られている知識はありますか? ある方向から別の方向に進む場合に注意すべき落とし穴はありますか? 最も適切な説明をした人にチェックマークが付けられます。

4

3 に答える 3

1

ifテンプレートでスイッチを使用して、最初のオプションを使用します。

ローカリゼーションの場合を考えてみましょう。言語ごとに異なるテンプレートを使用する可能性があります。テンプレート自体で「匿名」ケースを簡単にローカライズできます。

また、データモデルは出力側とは何の関係もありません。ユーザーが名前を持っているかどうかをテストしたい場合、コードの残りの部分で何をしますか? == 'Anonymous'毎回チェック?

テンプレートは実際にはデータの出力のみに関係する必要がありますが、出力ステートメントのみで構成する必要があるという意味ではありません。if user is logged in, display "Logout", otherwise display "Register" and "Login"通常、テンプレートにはある種のケースがあります。これらを回避することはほとんど不可能です。

于 2010-05-24T05:08:17.240 に答える
1

個人的には、クリーンなコードが好きで、テンプレートに主要なロジックを含めないことに同意します。したがって、私の実装では、すべての値に「安全な」デフォルト値、通常は空の文字列、基本クラスへのポインター、または同等のものがあることを確認します。これにより、コードの 2 つの大きな改善が可能になります。1 つ目は、null または欠損値を常にテストする必要がないことと、表示テンプレートにロジックを追加しなくてもデフォルト値を出力できることです。

したがって、あなたの状況では、基本値へのデフォルトのポインターを作成することが最善の解決策のように聞こえます。

于 2010-05-24T05:21:54.390 に答える
0

3 番目のオプション:User匿名ユーザーを表す通常のエンティティを作成します。

私はNoneデータベースの整合性の理由からのファンではありません。

于 2010-05-24T05:49:44.483 に答える