2

文字列、ブール値などの多くのフィールドを持つクラスが必要であり、クラスが構築されるときに、各フィールドに関連付けられたフィールド名を持ち、フィールドを検証したい (文字列の正規表現を使用)。理想的には、パラメーターが特定の基準を満たす必要があることをコンストラクターで指定したいだけです。

方法のサンプルコード:

case class Data(val name: String ..., val fileName: String ...) {
  name.verify
  // Access fieldName associated with the name parameter.
  println(name.fieldName) // "Name"
  println(fileName.fieldName) // "File Name"
}

val x = Data("testName", "testFile")
// Treat name as if it was just a string field in Data
x.name // Is of type string, does not expose fieldName, etc

これを達成するエレガントな方法はありますか?

編集:私が求めているものを明確に理解できたとは思いません。いくつかの文字列パラメーターを持つクラスがあります。これらの各パラメーターは特定の方法で検証する必要があり、各パラメーターに関連付けられた文字列 fieldName も必要です。ただし、パラメーターを通常の文字列のように処理できるようにしたいと考えています (例を参照)。

ロジックを Data にコーディングし、各パラメーターの Data コンパニオン オブジェクトの apply メソッドとしてコーディングすることもできましたが、もっと一般的なものを望んでいました。

4

1 に答える 1

3

コンストラクターにロジック (パラメーターの検証など) を入れるのは疑わしいです。コンストラクターからの例外のスローは二重にそうです。

通常、この種の作成パターンは、1 つまたは複数のファクトリ メソッドまたは何らかのビルダーで提供されるのが最適です。

基本的なファクトリの場合は、必要なファクトリ メソッドを使用してコンパニオンを定義するだけです。同じ簡略表記 ( new-free ) が必要な場合は、定義済みをオーバーロードできますapply(ただし、署名がコンストラクターと正確に一致するものを置き換えることはできませんcase class)。

バリデーションが失敗したときの例外処理の煩わしさからクライアント コードを解放したい場合は、代わりにOption[Data]orを返すことができますEither[ErrorIndication, Data]。または、ScalaZ のValidation.

ただし、提示するプロパティが異なるインスタンスを持つことはできません。サブクラスでさえ、パブリック API から減算することはできません。それを可能にする必要がある場合はtrait、共通部分のacase classや、バリアントや拡張の個別の es など、より複雑な構造が必要になります。

于 2013-02-14T00:12:59.417 に答える