7726


FRPを使ったアプリを作っていて思ったのですが、StreamはDDDでどう表現すれば良いのでしょうか？  
「GitHubから通知を受け取ってMacの通知を送る」ということをやりたいのですが

[code]

    // stream
    let stream = GitHubStream()
    stream
        .generateNotificationsStreamAtInterval(10 as NSTimeInterval, since: NSDate())
        .filter { ($0 as Notification).reason == .Mention }
        .filter { ($0 as Notification).subject.isComment() }
        .flattenMap { (notification) in
            let notification = notification as Notification
            return stream.generateCommentStream(
                notification.repository.owner.login,
                repoName: notification.repository.name,
                commentId: notification.subject.commentId!
            )
        }.map { (comment) in
            let comment = comment as Comment
            return UserNotification(
                title: "Hoy",
                subtitle: nil,
                informativeText: comment.body,
                contentImage: NSImage(contentsOfURL: NSURL(string: comment.user.avatarUrl)!),
                identifier: nil,
                openUrl: comment.htmlUrl
            )
        }
        .subscribeNext { (userNotification) in
            let userNotification = userNotification as UserNotification
            userNotification.notify()
        }
    
[/code]

ドメイン層なしにこんな感じのコードになっています。  
GitHubStreamとUserNotificationはインフラ層になると思うのですが、インフラ層からリアルタイムに流れてくるデータをどのようにドメイン層で扱えば良いのでしょうか。

よろしくお願いいたします。


CC BY-SA 3.0
2015-03-06T14:49:07.360
7560
2015-03-10T10:19:13.527
7737
question
swift ドメイン駆動設計
DDDでStreamの表現の仕方について


Swift については詳しくありませんが、ドメイン層はインタフェースを規定する場所なので、 GitHubStream や UserNotification
のインタフェースを提供する Protocol をドメイン層で提供するのが良いのではないでしょうか。そうすれば、アプリケーション層から利用される
Protocol が明確になりますし、インフラ層の GitHubStream では Protocol
要件を満たすことに専念してコードを書くことが出来ます。また、GitHubStream 互換のテスト用のモックを提供したり、GitHubStream
の代わりに BitbucketStream を書いたり、将来 GitHub の API 仕様が変わった場合に Protocol
を見ながらインフラ層を書きなおしたりすることができます。

なお、質問文に書かれているコード自体も、インタフェースを明確にしつつ（例えば、 activateNotification,
inactivateNotification
など）ドメインサービスで定義し、実装をインフラ層で持つのが良いと思います。アプリケーション層でそのサービスに対して stream を DI
して利用するイメージです。そうすれば、アプリケーション層において、要件に応じて「通知サービス」の実装を切り替えて利用することもできます。


CC BY-SA 3.0
2015-03-10T10:10:37.937
7726
2015-03-10T10:19:13.527
2015-03-10T10:19:13.527
5997
5997
7560
answer