コントロール抽象
2961 ワード
直交設計の基本原則に基づいて、設計に重複する制御論理が現れた場合、安定した抽象を抽象することができる.
本論文では,いくつかの反復により,直交設計の基本原則に従い,再構成を柔軟に適用し,設計を徐々に改善し,参考に供する.
需要1:検索ディレクトリの下にある拡張子
迅速な実装
需要2:検索ディレクトリの下の名前
繰り返し
需要3:検索ディレクトリの下の名前が特定のモードに一致するすべてのファイル
リピート再生
抽象を抽出
上記の実装の重複を解消するには、最も重要なのは、共通の注目点:
類型推論
タイプ別名
パラメータの簡略化
パラメータ伝達を簡素化し,不要な冗長性を除去することは,単純設計の基本原則の一つである.
置換
コリー化
「コリー化」を応用して、見事な「大かっこ」がついに舞台に登場した.
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) }
}