1. 概要

このチュートリアルでは、Scalaでの名前付き引数とデフォルト引数のサポートを確認します。 これらの機能によってコードがどのように改善されるかを示し、いくつかの例を示します。

2. デフォルトの引数

Scalaでは、メソッドにパラメーターがある場合、それらのデフォルト値を定義するオプションがあります。 デフォルト値が適切に選択されていれば、メソッド呼び出し元が記述できるコードが少なくなります。

  def prettyPrint[A](input: Array[A],
                     start: String = "(",
                     separator: String = ",",
                     end: String = ")"): String = input.mkString(start, separator, end)

メソッドprettyPrintは、汎用配列の優れたString表現を作成します。 その最初の引数である入力配列にはデフォルト値がありませんが、他のすべてのパラメーターにはデフォルト値があります。

したがって、呼び出す方法には2つの選択肢があります prettyPrint。 まず、メソッド定義で提供されているデフォルトのパラメーターに問題がない場合は、最初の引数を除くすべての引数を省略できます。

prettyPrint(Array(1, 2, 3)) shouldBe "(1,2,3)"

同時に、柔軟性の損失はありません。 たとえば、入力配列の要素を角かっこで囲み、セミコロンで区切る場合は、すべての引数を指定してprettyPrintを呼び出すことができます。

prettyPrint(Array(1, 2, 3), "[", ";", "]") shouldBe "[1;2;3]"

3. 名前付き引数

前のprettyPrintの例には、本質的な欠点があります。 メソッドパラメータの大部分はプレーンな文字列であるため、コンパイラはセパレータを開始または終了と混同することを防ぐことができませんでした。そのため、きれいな文字列ではなく、醜い文字列表現になってしまう可能性があります。

幸い、名前付き引数を使用すると、この問題が軽減されます。 Scalaを使用すると、メソッドパラメーターに名前を付けることができます。これにより、多くの場合、コードの可読性が向上し、エラーが発生しにくくなります。たとえば、名前付き引数を使用すると、前述の prettyPrint より透明で自明なものと呼ぶ:

 prettyPrint(Array(1, 2, 3), start = "[", separator = ";", end = "]") shouldBe "[1;2;3]"

名前付き引数を使用する際に覚えておく必要がある唯一の制限は、名前なしパラメーターは常に名前付きパラメーターの前になければならないということです。 それを台無しにすると、コードはコンパイルされません。

prettyPrint(start = "{", separator = ",", end = "}", Array(1, 2, 3))

4. クラスコンストラクターの名前付きパラメーターとデフォルトパラメーター

名前付き引数とデフォルト引数の最も一般的な例の1つは、それらをクラスコンストラクターに適用することです。 多くのビジネスドメインのエンティティには、多くの場合、適切なデフォルト値を持つ多くのパラメータがあるため、それらの操作が簡単になります。

いくつかの配達サービスでの注文の限定バージョンを表すクラスでそれを説明しましょう:

case class DeliveryOrder(product: String,
                           addressToDeliver: String,
                           amount: Int = 1,
                           promoCode: Option[String] = None,
                           byTime: Option[LocalDateTime] = None,
                           comments: Option[String] = None
                )

DeliveryOrder には、2つの必須フィールドと4つのオプションフィールドがあります。これは、数十のパラメーターを持つことができる実際の例を単純化したものです。 ただし、デフォルトの引数と名前付き引数によってコードの可読性がどのように向上するかは明らかです。

val orderWithNamedAndDefault = new DeliveryOrder(product = "Pho Bo",
  addressToDeliver = "42 Some Street, suite 24",
  promoCode = Some("SALE42")
)
val orderWithoutNamedAndDefault = new DeliveryOrder(
  "Pho Bo",
  "42 Some Street, suite 24",
  1,
  Some("SALE42"),
  None,
  None
)
orderWithNamedAndDefault shouldBe orderWithoutNamedAndDefault

orderWithoutNamedAndDefault と比較すると、 orderWithNamedAndDefault 式は冗長性が低く、ビジネスモデルのDeliveryOrderに関する情報を読者に提供します。 その結果、コードの可読性が向上します。

5. 結論

このチュートリアルでは、Scalaでの名前付き引数とデフォルトの引数のサポートにより、コードの冗長性を減らすことでコードの読みやすさを向上させる方法を学びました。

いつものように、このチュートリアルで使用されているすべての例を含むソースコードは、GitHubにあります。