はじめに
皆さんはstatic使いこなしていますでしょうか?
恥ずかしながら筆者はエンジニアになってからstaticを使った記憶がありません。
ですが最近、弊社プロダクトでマジックナンバーを取り扱うロジックを調査したところ、staticの有用性に気付いたので記事にしてみました。
static classの調査
きっかけ
筆者が作成しているプロダクトでマジックナンバーを使おうとして、既存の処理はどうなっているか調べたところ、下記のようなenum専用のclassを作って管理をしていました
<?php
namespace App\Enum;
use MyCLabs\Enum\Enum;
class BaseBallBackNumberEnum extends Enum
{
private const OTANI_SHOHEI = 17;
private const FUZINAMI_SHINTARO = 11;
}
正直「いやなんでconfigっていう機能があるのにわざわざ作り直してるんや」となりました。
それで何かしら理由があるのだろうと思いconfigの欠点を調べてみたところ、configは上書き可能だから危険だそうです。
configではconstとか定義しているのでおそらくstatic classっぽいのに上書き可能なの??となりさらに調査を進めました。(※ちょっとややこしいのですが、configはstatic functionでした。ただ動きは一緒だと思われるので便宜的にstatic classとして以降は記述をつづます。参考にさせていただいた記事)
結局static classとは...
筆者はこれまでstatic(静的)というくらいだから不変であるのが売りだと思ってきたのですが、これが間違いで、static classというのは常時インスタンス化されているclassを指すものだったのです。
つまるところ、いつでも使えるというだけでそれ以外は他のclassと何も変わらないので、classの中でpublicな変数を準備すると、どの処理でも使える変数が出来上がるというわけです。
static classでできているconfig(具体例)のメリット・デメリット
configが上書き可能であることの何がいいかの例ですが、負荷が高くなった時に各処理で解放しているメモリを上げたいという場面で、いろんな場所で使われるそのメモリの値の変数を使用しておけば、どこかの1つの処理でメモリ数を変更することで一気にシステム全体をコントロールできるようになります。
一方で、通常のマジックナンバーとしてconfigを扱うと、マジックナンバーを使った処理付近の編集の機会が多くなるため、何かの間違いで変数を上書きしてしまいやすいというデメリットも存在します。
ゆえに最初しか触らず編集機会の少ないPCの設定部分で使うのがいいのがconfigなんだろうなと考えられるというわけです。
マジックナンバーにあった書き方とは
それじゃあ最初のマジックナンバーどうするのかという話ですが、classの中でprivate関数を使って使いまわせば良いわけです。
加えて常時使うわけではないのでメモリの節約として非静的(動的)なclassで作って毎度インスタンス化するとなおgoodとなるわけですね。
するときっかけで書いた弊社プログラムのように落ち着くというわけだったのです。
(とは言いつつマジックナンバーのメモリ使用量は微々たるものなので、あっちこっちでインスタンス化の記述を増やさず、static classでprivate変数を含むものを一個作っておくとより良くなるのかなぁとこの記事を書いていて思いました。)
結論(static classの存在意義)
上記の調査から、アプリ開発者にとってstatic classの存在意義とは、
classを使いたいときに毎度インスタンス化の処理が必要ないので、"常時使う変数"または"あっちこっちで使われる変数"を準備するのに便利であること
だと思われます。
何かのお役に立てていただければと思います。