猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

いつ iPhone 11 を買い替えるべきなのか、GitHub Copilot と学ぶ

僕は今 iPhone 11 Pro を使っている

iPhone 11 Pro を買った理由は超広角レンズが搭載されたからだが、それ以降、僕が「iPhone買い替えたい」と思うような状況は無かった。

/**
 * iPhone の買い替えを検討してくれるクラス
 */
class IphoneReplacementDecider {

    /**
     * @param utakata ブログの筆者
     * @param iphone 買おうとする iPhone
     */
    public boolean decide(Human utakata, Iphone iphone) {
        return
            utakata.getCurrentIphone().isTooOld() &&
            utakata.isImpressedBy(iphone.getNewFeatures())
    }
}

今の iPhone がある程度古くなってきて、かつ、新しい機能(NewFeatures)に衝撃(isImpressedBy)を受けた場合に購入することにしている。


GitHub Copilot (プログラミングをサポートしてくれるAI)はバッテリーの条件に含めようとしてくるが、最近はバッテリーの性能が上がっているのか、バッテリーの問題はまだ起こっていない。

色の薄い部分は GitHub Copilot が提案してくれたコード


過去にどういう修理をしたことがあるか iPhone の設定から確認できるが、僕は修理をしたことがないので修理の履歴は出ていなかった。

iPhone を修理に出したことがある場合は、「設定」>「一般」>「情報」に「部品と修理の履歴」セクションが表示され、部品が Apple 純正部品によって修理されたか、または不明な部品によって修理されたかが表示されます。 (https://support.apple.com/ja-jp/102658 より)


Iphone.isTooOld の条件は古い

なお、Iphone.isTooOld を購入の条件に含める実装は少し古い。iPhone が新しい場合は Apple の下取りの金額も上がるので、今持っている iPhone の古さにあまり関係なく、NewFeatures に impressed されたら買うべきである。

ただ、古すぎるとアプリが重くなってくるので、 iPhone 11 はもう買い替えたほうが良さそう。


背面がバキバキだと修理代が高い

僕は基本的に iPhone をケースに入れているので、画面や背面がバキバキになることはないのだが、「もう古い iPhone だからケースつけなくてもええやろ」で画面を落として背面がバキバキになった。

画面がバキバキになった場合は画面修理で済むが、背面がバキバキになった場合は背面だけの交換はできず、本体交換になってしまう(そして高くつく)ので、いっそ機種変更してしまいたい。

初売りで古い機種 vs 最新機種

Apple は毎年9月頃に iPhone を発表する。今年は iPhone 16 になる。ここですごいほしい機種が出れば買うしか無い。

もし iPhone 16 が魅力的じゃなかったら...?初売りで iPhone 15 を買おうと思う。Apple は年始に初売りセールをしており、最新機種の一つ前、つまり iPhone 15 が今年は初売りの対象になる。

// 初売り対象かどうかの判定を Iphone クラスが持つのは微妙な気がする
class Iphone {
    public boolean isHatsuuriTarget(int year) {
        switch (year) {
            case 2024:
                // 今年の初売りはおそらくこんな感じだろう...
                return this.isIphone14() || this.isIphone15();
        }
    }
}

// Service クラスは状態を持たないほうがいいので、year をプロパティにしているのは微妙
// 状態を持つと「今この Service の year には何の値が入っているのか?」を覚えながらコードを読む必要がある
// 可読性が下がる
class HatsuuriService {
    int year;

    public function HatsuuriService(int year) {
        this.year = year;
    }

    public boolean isTarget(Iphone iphone) {...}
}

// 素直な Service の実装はこうかな...
class HatsuuriService {
    public boolean isTarget(int year, Iphone iphone) {
        witch (year) {
            case 2024:
                return this.isIphone14() || this.isIphone15();
        }
    }
}


iPhone 15 で魅力を感じるところは?

  • 5G が使える(5G自体は iPhone 12 から搭載)
    • iPhone 11 を買おうとした時に唯一迷ったのが、iPhone 11 が 5G に対応していなかったことだ
    • しかし、4G で困ることはほぼ無かったので、5G にしたいモチベーションは無い...
      • 5Gのほうが混雑している場所でスムーズに通信できるのでは?と思ったが、最近は 5G を使う人が増えたためか、はたまた、基地局が強くなったのか、4Gで重くなることはほとんど無い
  • 端子が USB Type-C になった
    • 正直、これが一番魅力的である
  • カメラの性能が良くなった
    • ただしデカくなって邪魔だ


iPhone のカメラがソニーからサムスンになるというウワサ

ちなみに、iPhone のカメラがソニーからサムスンに変わるという噂がある。

最初にこの噂が出てきた時は、次の iPhone からサムスンのカメラに変わると言われていたが、今調べたら、「早ければ2026年」からというウワサに変わっていた。

ascii.jp

僕は日本人なのでソニーを応援したいところだが、ソニーからサムスンに変わるということは、なにか大幅な機能追加がある可能性がある。そこで、サムスン製のカメラになって isImpressed なら新しい iPhone を買うし、そんなに変わらなければソニーレンズの iPhone を買えばいいのではないか

となると、買うのは今年じゃないのかもしれない...

試しに GitHub Copilot に全部実装させてみる

悪くはないが、できれば while の最後で1年待ったりしてほしかったので、コメントを追加してみたが、何も変わらなさそうだった。

ちなみに...

何もない状態で GitHub Copilot にアルゴリズムを実装してもらうと、僕がすごい勢いで働かされる。定年退職はせず、死ぬまで働くようだ。



まとめ

for (int year = 2024; true; year++) {
    // iPhone が発表されるまで待つ
    while(isNewIphoneAnnounced(year)) {
        sleep();
    }
    Iphone latestIphone = appleRepository.getLatestIphone(year);
    Iphone outlatedIphone = appleRepository.getLatestIphone(year - 1);

    // 新しい iPhone がめちゃめちゃ欲しい場合は買って終わり
    if (isImpressedBy(latestIphone)) {
        buy(latestIphone);
        return:
    }

    // 新しい iPhone がめちゃめちゃ欲しいわけでもない場合
    // 新しい iPhone のカメラがサムスンになっていたら、一つ前のソニーのカメラを買う
    if (latestIphone.getCamera().isManufacturedBySumsung()) {
        // このタイミングで初売りがなくなった場合は死ぬまで待つというバグがある
        waitFor初売り();
        buy(outdatedIphone);
        return;
    }

    // 新しい iPhone もソニーだった場合は翌年へ
}