### 問題: 手続きを定義しなさい。引数には `method`と`path`を受け取る。 `method` は `GET`, `POST`, `HEAD`, `PUT`などの文字列である。 path は `/` から始まる任意の文字列である。 (`"/"` だけの場合もありうる) 返り値は `[status, contents]` からなるリスト/配列とする。 `status`は`"200 OK"`, `"404 NotFound"`などの文字列である。 `contents`は、method, path の関係ごとに紐付けられた文字列である 以下の要件を満たすように実装せよ。 ``` GET "/hello" → ("200 OK", "こんにちは") GET "/bye" → ("200 OK", "さよなら") POST "/bye" → ("200 OK", "ばいばい") PUT "/bye" → ("200 OK", "Good bye") 該当なし → ("404 NotFound", "ないです") POST "/hello" → ("405 NotAllowed, "だめです") ``` 処理とデータは可能な限り分離せよ。 `if (path == "/hello") 〜 elseif (path == "/bye")`のように、条件文にマジックナンバーが含まれるコードは望ましくない。 ### 回答 ```javascript= const make_server = (routes, not_found, not_allowed) => { return (method, path) => { if (routes[path]) { if (routes[path][method]) { return routes[path][method]; } return not_allowed; } return not_found; } } const server1 = make_server({ "/hello": { "GET": ["200 OK", "こんにちは"] }, "/bye": { "GET": ["200 OK", "さよなら"], "POST": ["200 OK", "ばいばい"], "PUT": ["200 OK", "Good bye"], } }, ["404 NotFound", "ないです"], ["405 NotAllowed", "だめです"]); const server2 = make_server({ "/hello": { "GET": ["200 OK", "Hello"] }, "/bye": { "GET": ["200 OK", "Good bye"], "POST": ["200 OK", "bye bye"], "PUT": ["200 OK", "Good bye"], } }, ["404 NotFound", "Not Found"], ["405 NotAllowed", "Not Allowed"]); ```