コードの最適化って難しい

## はじめに
プログラミングをしていて、どうせなら**コードをきれいにしたいなぁ**って思うことは何度もありますよね。  
そのためにCodeSceneやらCodeMetricsやらを入れてメソッドの肥大化だとかなんとかを可視化出来るようにしているのですが・・。

ちょっと悩んだのでメモ。

## こんな感じのコード
```java:example.cls
private static void updateBeforeValue(String objectId) {
    
    // 現在の値を取得
    ObjectA__c o = [
        SELECT
            Id
            ,Name
            ,ColumnA__c
            ,ColumnB__c
            ,ColumnC__c
            ,ColumnD__c
            ,ColumnE__c
            ,ColumnF__c
        FROM ObjectA__c
        WHERE Id = :objectId
    ];

    // それぞれXXBefore__cに現在の値をセットして更新
    update new ObjectA__c(
        Id = objectId
        ,NameBefore__c = o.Name            
        ,ColumnABefore__c = o.ColumnA__c
        ,ColumnBBefore__c = o.ColumnB__c
        ,ColumnCBefore__c = o.ColumnC__c
        ,ColumnDBefore__c = o.ColumnD__c
        ,ColumnEBefore__c = o.ColumnE__c
        ,ColumnFBefore__c = o.ColumnF__c
    );
}
```
Salesforceのコードが元になっているので、見慣れてない人はちょっと馴染みない構文かもしれませんが、コメントを見たらやってることはわかる・・はず。

で、今回項目数がせいぜい10足らずなので良いですが、これが30項目くらいのときが問題です。

<details>
<summary>長いので折り畳み</summary>

```java:example.cls
private static void updateBeforeValue(String objectId) {
    
    // 現在の値を取得
    ObjectA__c o = [
        SELECT
            Id
            ,Name
            ,Column1__c
            ,Column2__c
            ,Column3__c
            ,Column4__c
            ,Column5__c
            ,Column6__c
            ,Column7__c
            ,Column8__c
            ,Column9__c
            ,Column10__c
            ,Column11__c
            ,Column12__c
            ,Column13__c
            ,Column14__c
            ,Column15__c
            ,Column16__c
            ,Column17__c
            ,Column18__c
            ,Column19__c
            ,Column20__c
            ,Column21__c
            ,Column22__c
            ,Column23__c
            ,Column24__c
            ,Column25__c
            ,Column26__c
            ,Column27__c
            ,Column28__c
        FROM ObjectA__c
        WHERE Id = :objectId
    ];

    // それぞれXXBefore__cに現在の値をセットして更新
    update new ObjectA__c(
        Id = objectId
        ,NameBefore__c = o.Name            
        ,Column1Before__c = o.Column1__c
        ,Column2Before__c = o.Column2__c
        ,Column3Before__c = o.Column3__c
        ,Column4Before__c = o.Column4__c
        ,Column5Before__c = o.Column5__c
        ,Column6Before__c = o.Column6__c
        ,Column7Before__c = o.Column7__c
        ,Column8Before__c = o.Column8__c
        ,Column9Before__c = o.Column9__c
        ,Column10Before__c = o.Column10__c
        ,Column11Before__c = o.Column11__c
        ,Column12Before__c = o.Column12__c
        ,Column13Before__c = o.Column13__c
        ,Column14Before__c = o.Column14__c
        ,Column15Before__c = o.Column15__c
        ,Column16Before__c = o.Column16__c
        ,Column17Before__c = o.Column17__c
        ,Column18Before__c = o.Column18__c
        ,Column19Before__c = o.Column19__c
        ,Column20Before__c = o.Column20__c
        ,Column21Before__c = o.Column21__c
        ,Column22Before__c = o.Column22__c
        ,Column23Before__c = o.Column23__c
        ,Column24Before__c = o.Column24__c
        ,Column25Before__c = o.Column25__c
        ,Column26Before__c = o.Column26__c
        ,Column27Before__c = o.Column27__c
        ,Column28Before__c = o.Column28__c
    );
}
```

</details>

これが1メソッドになっているとちょっと、どうなの？という話。

## 悩みどころ
ただ「じゃあ取得のクエリを切り出したらいいじゃん」と考えると、それはそれでちょっと悩んでいます。  
これは今回のケースがそうだった、というだけなのですが、この取得クエリは間違いなくここ以外で使うことがないです。

となると
- 関数に切り出すことで、コードを見るときに処理の順序とコードの順序が一致しなくなる
    - `updateBeforeValue`を見始めて、取得処理を見たいのでこのメソッドの上or下に書かれた`getObjectA`を見に行って、戻ってきて更新処理を見て・・となる
- 切り出したところで、更新処理の部分が長いから焼け石に水感がある
- 取得処理自体はインデントが深くなったりもしないので、複雑化しているかと言われると微妙なところ

という懸念点に対して、切り出すメリットが
- メソッドは短くなる（コード長自体は変わらない）

だけなんですよね。

## もう少し屁理屈をこねる
基本に立ち返って、コードを最適化する目的を考えます。
- コードが見やすくなっていることで、可読性が高まる
- 1つ1つの処理の結びつきが浅くなっている（疎結合といいます）ことで、保守性が高まる
- 無駄な処理がなくなることで、処理が高速化する

今回のケースで考えると・・  
あれぇ！？最適化したところで、何も高まらないんじゃないか！？？？！？？！？

## おわりに
正直派閥次第なので、間髪入れず切り出す人もいるでしょうしこのままにする人もいると思います。  
僕はかなり悩みましたが、そのままにしました。  

メソッドが多いとそれはそれでアウトラインが見にくいんじゃ・・。