# 故意の技術的負債から目を逸らさない

[修正前のコードから一部抜粋](https://github.com/weseek/growi/blob/rc/3.7.0/src/server/routes/apiv3/security-setting.js)

```js:security-setting.js
twitterOAuth: [
    body('twitterConsumerKey').if((value, { req }) => req.body.twitterConsumerKey).isString(),
    body('twitterConsumerSecret').if((value, { req }) => req.body.twitterConsumerSecret).isString(),
    body('isSameUsernameTreatedAsIdenticalUser').if((value, { req }) => req.body.isSameUsernameTreatedAsIdenticalUser).isBoolean(),
  ],
```

[GROWI](/GROWI) 各種認証機構設定の[バリデーション](/用語集/バリデーション)で上記のように実装していました。  
request body に該当する key が存在していた時のみ、チェックを行うというものです。

しかし、このコード非常に読みに難くなっています。  
`if((value, { req }) => req.body.twitterConsumerKey)`　　  
実装した本人が見ても少し違和感を覚えるコード... *(過去の自分は他人である...)*

このコードは [express-validator](/用語集/Express/express-validator) の [Docs](https://express-validator.github.io/docs/validation-chain-api.html#ifcondition) から引っ張ってきたものです。

>   Docs より引用  
> body('oldPassword')  
>   // if the new password is provided...  
>   .if((value, { req }) => req.body.newPassword)  

書いてみて問題なく動いたので、特に可読性を意識せずに実装してしまいました。  
セキュリティ画面の React 化[^1]を早く終わらせたいと焦っていたのもあります。

**プログラマが知るべき97**というサイトでこのように書いてあります[^2]

>「正しくやる方法」と「手早くやる方法」があれば、後者のほうが魅力的に見えてしまうことはよくあります。  
>(~中略~)  
>次のイテレーションなどが修正のチャンスなのですが、実際にイテレーションが始まると、また新たな問題が起きてそちらに注力してしまい、結果、修正が不可能になってしまうことも多いのです。  
>このように先送りされていく修正作業のことを **「技術的負債(Technical debt)」** などと呼ぶことがあります。

終わらせたい一心で「手早くやる方法」をとってしまいました。  

もちろん良いコードを書こうとして終わらないのは以ての外だとは思いますが、  
少なくとも今回のように **Docs の実装方法を丸パクリ** するのではなく、そのライブラリでどのようなことが実現できるのか理解して実験することは必要でしょう。

今回は別の箇所で同じようなコードを実装していた時に指摘されたために気づき修正できましたが、これが 1年、2年と経つうちに手のうちようがない自体になったかもしれません。

技術的負債がいつ産まれるのかを痛感した出来事でした。

-------

ちなみに修正後のコードは[このようになりました](https://github.com/weseek/growi/pull/1749)。
```js:security-setting.js

twitterOAuth: [
    body('twitterConsumerKey').if(value=> value != null).isString(),
    body('twitterConsumerSecret').if(value=> value != null).isString(),
    body('isSameUsernameTreatedAsIdenticalUser').if(value=> value != null).isString(),
```
`if(value=> value.exists())` でも動きますが、 null チェックであることを明示的に表すコードに落ち着きました。  
もっと良い書き方がありましたら教えてください。

[^1]: [v3.7.0 にて取り込まれました](https://github.com/weseek/growi/releases/tag/v3.7.0):tada:
[^2]: https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%88%86%E5%88%A5%E3%81%AE%E3%81%82%E3%82%8B%E8%A1%8C%E5%8B%95/

---

## Page Navigation

- Canonical URL: https://tips.weseek.co.jp/GROWI/故意の技術的負債から目を逸らさない
- Permalink: https://tips.weseek.co.jp/5e71da49df47e40049fa6c6f
- Parent: [GROWI](/5e393927e848c600487d6a01.md)
- Children: 0 total
- Total descendants: 0
- Siblings: 8 total
  - [GROWIでapiを叩いてみよう](/5e4d5253340a4f0049473d2b.md)
  - [GROWIにおけるBootstrap](/5e3938c6e848c600487d69fa.md)
  - [GROWIのバージョンを下げた時に、nodeのバージョンで怒られた時の対処法](/5f7c32e8b8f345004895b23e.md)
  - [SSOと仲良くなろう](/5f99372a04330d004832a02c.md)
  - [formのactionでPUTとDELETEが送れない件](/5e789d45a5e29a004842ba63.md)
  - [reactstrap を使ったコンポーネントのレンダリング制御](/5e424e61decd0a0049953ae1.md)
  - [分割代入を使って見通しの良いコードを書こう](/5e3e6f19591d7f0048b3cc69.md)
  - [実例で見るpointer-eventsの使い方](/5e50df38839fe70048321573.md)
- Last updated: 2020-03-18T08:32:37.165Z by deleted_at_1672138397219
- Full page listing (all children regardless of count): https://tips.weseek.co.jp/_api/v3/page-listing/children?id=5e71da49df47e40049fa6c6f
