ユーニックス総合研究所

  • home
  • archives
  • programming-abstraction

プログラミングの抽象化は生産性を向上する?

プログラミングの抽象化による生産性の爆上げ

プログラミングにおける「抽象化」とはなんなのか?
抽象化とは「問題を簡単に」し、「コードを美しく」して、「生産性を爆上げ」する魔法の方法です。

もちろんデメリットもあるし失敗することもありますが、開発者のスキルが高ければ抽象化はこれらのメリットを得ることが出来る手法です。

この記事では「抽象化とは何なのか?」というところからはじめて、具体的な抽象化の方法についても具体例を持って解説します。
この記事を読めばあなたは今日から抽象化の意識が芽生え、それをあなたのツールボックスのコレクションの1つに加えたくなることでしょう。

🦝 < 抽象化によって意識が高くなる

具体的には抽象化について↓の内容を見ていきます。

  • 抽象化とはなんなのか?
  • 抽象化によって問題が簡単になる
  • 抽象化によってコードが美しくなる
  • 抽象化によってプログラミングの生産性が上がる
  • 抽象化のデメリット

抽象化とはなんなのか?

プログラミングにおける抽象化とは、コードを整理してまとめて、それらに名前をつけて管理し、抽象的な個体に抽出することを指します。
プログラミングにおける問題、つまりコードを抽象的に扱うようにして、コードを書きやすくして問題の解決を簡単にすることが抽象化の目的です。
さらに抽象化はコードを美しくしてプログラミングにおける生産性を上げることが出来る魔法のメソッドです。

これは言ってしまえば関数のことです。
複数の処理を関数にまとめて抽象化するということが、抽象化の本質です。

たとえばプログラミングにおける具体的な問題A, B, Cがあったとしましょう。
これらの問題は鮮明で詳細です。そしてその問題がむき出しになっています。
これらの問題を1つにまとめて抽象化し、3つあった問題を1つのシンプルな問題に変換します。

こうすることで開発者の頭を悩ませている複数の問題の数を減らし(抽象化し)、コードの見通しをよくするのです。
抽象化は多くのプログラミングでごくごく一般的に行われています。

私も今より下手だった時があるからわかるのですが、プログラミングが下手な人はたいていこの抽象化が下手です。
問題の管理ができず、ファイルの中に問題が整理されず散らかっていて、それらをまとめようにもモチベーションが上がらず、結局そのまま放置して開発を進め、プロジェクトの健康状態を悪くしていきます。
この状態の開発者は生産性が低く、またプログラムの品質も低いことが多いです。

私も経験的にこの状態になることが今でもたまにありますが、やはりその状態で良いコードは書けません。
問題を抽象化することはプロジェクトの健康状態を上げることに繋がります。

抽象化をせずに問題をむき出しのままで管理すると開発者の負担がだんだんと増えていきます。
やがて、ふくらみきった問題の山が開発者に襲いかかり、開発者は立ち上がれなくなります。
パソコンのディスプレイに向き合えず、空を見つめ楽しかったときのことを思い出し、独り言をつぶやくようになります。

🦊 < みなさんもそうなりたいですか?

🦝 < いやどす

🐭 < いやどす

そうなりたくなければ、このプログラミングの抽象化を学ぶ必要があるということです。
幸いなことにプログラミングの抽象化は慣れと危険への嗅覚があればそれほど難しいことではありません。

抽象化によって問題が簡単になる

抽象化によって問題を簡単にする例を簡単にご紹介しましょう。
サンプルコードはPythonで記述します。

では↓のコードをまずは見てください。

enemy_name = None  
enemy_age = 0  
enemy_hp = 0  


def main():  
    global enemy_name, enemy_age, enemy_hp  

    enemy_name = "Tiger"  
    enemy_age = 4  
    enemy_hp = 200  

    if enemy_hp < 100:  
        print(enemy_name, 'cry')  
    else:  
        print('name', enemy_name)  
        print('age', enemy_age)  
        print('hp', enemy_hp)  


main()  

このコードは簡単なゲームのコードです。
敵のキャラクターを生成し、その敵の残りHPを見て処理を分岐しています。
このコードを抽象化してみましょう。

まず問題はグローバル変数です。
enemy_name, enemy_age, enemy_hpはグローバルな変数として宣言されていますが、これらは1つの敵キャラですべてを使ってしまいます。
つまり、敵キャラが1人だけのときはいいですが、敵キャラが複数になったときにコードの大幅な修正が必要になっています。

この問題を解決するには、これらのグローバル変数を1つにまとめて抽象化するようにします。
具体的にはクラスを使いましょう。

↓のようにEnemyというクラスを作り、その属性に先ほどの変数を作ります。

class Enemy:  
    def __init__(self, name=None, age=0, hp=0):  
        self.name = name  
        self.age = age  
        self.hp = hp  

こうすることで複数の問題を1つにまとめて抽象化します。
これでクラスからオブジェクトを作れば敵キャラが何人いても対応できるようになります。
問題が簡単になりました。

抽象化によってコードが美しくなる

さらに先ほどのコードを見てみましょう。
↓のif文を見てみてください。

    ...  
    if enemy_hp < 100:  
        print(enemy_name, 'cry')  
    else:  
        ...  

これは先程作ったクラスを使えば↓のように書き換えることができます。

    enemy = Enemey()  
    ...  
    if enemy.hp < 100:  
        print(enemy.name, 'cry')  
    else:  
        ...  

このコードを抽象化して美しくするにはどうしたらいいでしょうか?
以下にその1例を示します。

    enemy = Enemy()  
    ...  
    if enemy.can_cry():  
        enemy.cry()  
    else:  
        ...  

↑のようにするとむき出しの比較演算子がcan_cry()というメソッドに抽象化されます。
さらにEnemyが泣く時の処理をcry()に抽象化しています。
このようにしてみると、先程のコードよりコードの意味合いがわかりやすくなり、具体的な処理が抽象化されてコードが美しくなったなぁと感じないでしょうか。

抽象化によってプログラミングの生産性が上がる

さらに先程のコードを抽象化してみます。
↓の部分を見てください。

        print('name', enemy_name)  
        print('age', enemy_age)  
        print('hp', enemy_hp)  

敵キャラの情報を出力しているところで、なんと3行も使っています!
敵キャラの情報が増えればさらにこの行数は増えることになるでしょう。
if文の中で行数が増えるというのはなんとも美しくないものです。
できれば行数は少なくしたいのが開発者の良心というものです。

先程のEnemyクラスにshow()メソッドを追加し、↓のように書き換えます。

        enemy.show()  

ずいぶんスッキリしました。
show()メソッドに先程の複数行あった処理をまとめて抽象化することで、別のところで敵キャラの情報を出力したくなったとしても、その時に書くコードはenemy.show()だけです。
行数で考えるとこの抽象化によって生産性が3倍に上がったわけですから、抽象化の威力が相当なものであることがよくわかります。
3倍と言えば30年と10年の違いです。人生は短いのですからプログラマーは抽象化で時間を節約するべきでしょう。

抽象化のデメリット

ここまでいい所づくしの抽象化でしたが、失敗すると悲惨なことになります。
実は抽象化というのは、プログラマーとしての経験と勘が必要とされるメソッドなんですね。
ですので最初のうちはうまく抽象化ができないと思いますが、気にせずに失敗を繰り返すようにしてください。そのうち慣れます。
私もここまで偉そうに言ってきてますが、いまだに失敗することがあります。

🦝 < おいおい

抽象化に失敗すると、コードの複雑度が上がったり、逆にコードの量が増えたりします。
つまり逆効果です。そうならないように抽象化は慎重に行う必要があります。

おわりに

最後に冒頭のコードを抽象化したコードを見てみましょう。

class Enemy:  
    def __init__(self, name=None, age=0, hp=0):  
        self.name = name  
        self.age = age  
        self.hp = hp  

    def can_cry(self):  
        return self.hp < 100  

    def cry(self):  
        print(self.name, 'cry')  

    def show(self):  
        print('name', self.name)  
        print('age', self.age)  
        print('hp', self.hp)  


def main():  
    enemy = Enemy("Tiger", 4, 200)  

    if enemy.can_cry():  
        enemy.cry()  
    else:  
        enemy.show()  


main()  

main()関数に注目してください。
ずいぶんコードがシンプルになっていると思います。

抽象化はプログラミングのスキルを大幅に上げるメソッドです。
ぜひ身につけて抽象化を行えるようにしましょう。
時間を節約し、コードを美しくして、問題を簡単にする魔法のメソッド、抽象化。
これはやるっきゃないですね。

🦝 < 抽象化で開発を加速する!

抽象化は本当に生産性を上げるのか?

2023/08/30 追記
読者の方から抽象化では生産性は爆上げしないとの意見をいただきました。
たしかに「爆上げ」は言い過ぎだったかもしれません。