LoginSignup
Kusunoki__
@Kusunoki__ (T Kusunoki)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

実装パターン(またはイディオム)の名称について

解決したいこと

現在Swiftを用いて下記のようなコードをよく書いております。

// 適当な例
public class EntityGroup: EntityNode {
    private var entities :[EntityNode]

    public func setEntity(name: String, entityStyle: EntityStyle) {
       if Internal.hasEntity(name: name, in: self.entiies) == false {
           Internal.createEntity(name: name, into: self.entities, parent: self)
       } 
       guard let entity = Internal.find(name: name, in: self.entites) else {
           return
       } 
       Internal.applyStyle(entify: entity, entityStyle)
    }
}

// 状態を持たない、共通内部処理の委譲先
enum Internal {}
extension Internal {
   static public func hasEntity .. 
   static public func createEntity ..
   static public func find .. 
   ... 以下略
}

コードを書いているときは、C++のstdなどでよく見かけた手法を参考にしています(
下記の二つ)
ただ、そのやり口(手法)名前があると思うのですが、ずっと分からないままモヤモヤしている次第です。
もしご存知の方がいらっしゃいましたらご教授いただけると幸いです。

1つ目のやり口

C++でよく見かけるやり口です。代表的なものとしてはstd::findがあって、実装手法について下記のような特徴があります。
・例えばstd::findは、はnamespace stdの静的メソッドで状態を持ちません
・例えばstd::findは、渡されるテンプレート引数の型が提供しているpublic なメソッド(Iterator系メソッドなど)を使用して、手続きを隠蔽&提供します(std::findなら、特定の要素のイテレータを検索・返却する手続き)

このように特定のnamespace以下に静的メソッドを配置し、静的メソッドは引数とされる型の公開メソッドを使用し拡張した機能を提供するやり口について、デザインパターンなどで名前がついている気がしていますが、調査に苦戦しています。
(また引数として渡される型はconceptなどで制約されていることが多いと思います)

2つ目のやり口

公開APIと内部処理の関数を分けるといったような手法のやり口の用語も思い出せず引っかかっていています。合わせてご存知の方がいらっしゃいましたらコメントいただけると幸いです

下記のようなコードです。
(主題はAPIと内部実装の分離について言及していて、DRVII...?? みたいな名前だった気がするのですが..)

class ClassA {
  public:
    UserInfo getUserInfomation(const std::string& id) {
        return getUserInfomation_(id)
    }

  private:
    UserInfo getUserInfomation_(const std::string& id) {
        // internal process...
    }
}
0

1Answer

私は Swift については無知なので質問を十分に理解できていないかもしれないということはあらかじめお断りしておきます。

ひとつめについてはあえて言うなら Template Method パターンに該当するのではないかと思います。 しかしデザインパターンは同じような言語機能を使って同じような構成であっても意図 (用途) によって異なるパターンに割り当てられる場合もありますし、 Template Method は該当する範囲が広すぎるので分類があまり役に立たないかもしれません。

ふたつめについてはそのうろ覚えの名前の雰囲気から読み取ろうとすると NVI (Non virtual Interface) のことではないかと思います。 仮想関数として具体的な処理を書いたものを外側に対するインターフェイスは非仮想関数にするという手法です。

0

Comments

  1. @Kusunoki__

    Questioner
    Template Methodパターンは、親クラスにてある処理を抽象化して、その抽象処理を使って大枠の機能を提供するというパターンだと思っていました。今回その関係性を継承から、委譲として表現することである意味Template Methodと言えるかもですね..
    勉強になります!

    あ、そうです! NVIでした! RAIIとごっちゃになってました!
    ありがろうございます!

Your answer might help someone💌