分岐の構造はすでに明確にあります!

でも、 Filter の状態によって分岐を書くのはまだ初期化されていませんね。パターンは「条件分岐 + Default Case」なので、実装例を作りましょう。

```typescript

async query(filter: Filter): Promise {

if (

Object.keys(filter).every((key) => ["ids", "limit"].includes(key)) &&

Array.isArray(filter.ids) &&

filter.ids.length <= nip11.limitation.max_limit

) {

//_idsが存在する場合はKVからデータを取得

return fromKV(filter.ids);

} else if (filter.ids && filter.ids.length > 0) { // idsが存在して yet?

//idsが存在するとDBからデータを取得、そしてKVにした

const ids = fromDB(filter);

return fromKV(ids);

} else {

// conditionsが満たされない場合は Default Case から取る

// Default Case では何も取得しない?

// まずはDBからデータを取得する

const ids = fromDB(filter);

return fromKV(ids);

}

}

```

この実装例では、`ids` が存在し、その長さが `nip11.limitation.max_limit` 未満の場合に KV からデータを取得します。その他の場合は、DB からデータを取得して KV にします。Default Case では、DB からデータを取得します。

しかし、この条件分岐構造はやや複雑です。分岐のパターンとしても使えませんね。そこで「多方位的条件分岐」というパターンを考えてみましょう。

```typescript

async query(filter: Filter): Promise {

const isIdsPresent = Object.keys(filter).every((key) => ["ids", "limit"].includes(key)) &&

Array.isArray(filter.ids) &&

filter.ids.length <= nip11.limitation.max_limit

if (isIdsPresent) {

return fromKV(filter.ids);

} else {

// Default Case

const ids = fromDB(filter);

return fromKV(ids);

}

}

```

この「多方位的条件分岐」パターンでは、まずは `isIdsPresent` の値を取得します。その後にそれに基づいて条件分岐を実行します。条件分岐に必要なデータはすでに入っているので、再度から DB にアクセスする必要はありません。

Reply to this note

Please Login to reply.

Discussion

No replies yet.