コントロール抽象

2961 ワード

直交設計の基本原則に基づいて、設計に重複する制御論理が現れた場合、安定した抽象を抽象することができる.Scalaの強力な拡張性により、「かっこ」を不思議に「かっこ」に変換し、ユーザーコードに新しい制御構造を感じさせることができます.
本論文では,いくつかの反復により,直交設計の基本原則に従い,再構成を柔軟に適用し,設計を徐々に改善し,参考に供する.
需要1:検索ディレクトリの下にある拡張子.scalaのすべてのファイル
迅速な実装
object FileMatchers {
  def ends(file: File, ext: String) = {
    for (file 

需要2:検索ディレクトリの下の名前Testを含むすべてのファイル
繰り返し
object FileMatcher {
  def ends(file: File, ext: String) = {
    for (file 

需要3:検索ディレクトリの下の名前が特定のモードに一致するすべてのファイル
リピート再生
object FileMatcher {
  def ends(file: File, ext: String) = {
    for (file 

抽象を抽出
上記の実装の重複を解消するには、最も重要なのは、共通の注目点:Matcher: (String, String) => Booleanを抽出することである.
object FileMatcher {
  private def list(file: File, query: String, 
    matcher: (String, String) => Boolean) = {
    for (file  fileName.endsWith(ext))
    
  def contains(file: File, query: String) =
    list(file, query, (fileName, query) => fileName.contains(query))
          
  def matches(file: File, regex: String) =
    list(file, regex, (fileName, regex) => fileName.matches(regex))
}

類型推論Scalaの強力なタイプの推論能力により、より簡潔な関数のフォント値を得ることができます.
object FileMatcher {
  private def list(file: File, query: String, 
    matcher: (String, String) => Boolean) = {
    for (file 

タイプ別名listのパラメータはタイプ修飾のため、少し長すぎるように見え、読書に影響を与える.「タイプ別名」のメカニズムで関数のタイプ修飾子を短縮し、表現力を改善できます.
object FileMatcher {
  private type Matcher = (String, String) => Boolean

  private def list(file: File, query: String, matcher: Matcher) = {
    for (file 

パラメータの簡略化
パラメータ伝達を簡素化し,不要な冗長性を除去することは,単純設計の基本原則の一つである.
object FileMatcher {
  private type Matcher = String => Boolean

  private def list(file: File, matcher: Matcher) = {
    for (file 

置換for comprehension文法が複雑な「for comprehension」の代わりに「高次関数」をカスタマイズすることで、表現力を改善できます.
object FileMatcher {
  private type Matcher = String => Boolean

  private def list(file: File, matcher: Matcher) =
    file.listFiles.filter(f => matcher(f.getName))

  def ends(file: File, ext: String) =
    list(file, _.endsWith(ext))
    
  def contains(file: File, query: String) =
    list(file, _.contains(query))
          
  def matches(file: File, regex: String) =
    list(file, _.matches(regex))
}

コリー化
「コリー化」を応用して、見事な「大かっこ」がついに舞台に登場した.
object FileMatcher {
  private type Matcher = String => Boolean

  def list(file: File)(matcher: Matcher) =
    file.listFiles.filter(f => matcher(f.getName))

  def ends(file: File, ext: String) =
    list(file) { _.endsWith(ext) }

  def contains(file: File, query: String) =
    list(file) { _.contains(query) }

  def matches(file: File, regex: String) =
    list(file) { _.matches(regex) }
}