##ハイライト
1.関数型プログラミングを覚えるとどうなるのか
2.関数型プログラミングをどう実践するのか
3.関数型プログラミングとオブジェクト指向の共通点と違いは?
##関数型プログラミングを覚えるとどうなるのか
次のような悩みが減り、デバッグの効率が上がります。
「このフラグ、trueになるはずがfalseになってる!」
「どこにバグの原因があるかわからねえ」
「修正したらまたどこかで問題が出るかも」
##関数型プログラミングをどう実践するのか
次の2つの関数をきっちり分けて設計し、かつ、ピュアな領域を増やしてダーティな領域を小さくします。
###1.ピュアな関数
同じ引数に対して常に同じ結果を返し、かつ関数の外のスコープに影響がない関数のこと
###2.ダーティな関数
同じ引数でも違う結果を返す、または関数の外のスコープに影響がある関数のこと
##もっと具体的に教えて
下記は一例です。パッケージ分けるとファイルをわけるとか、命名で分けるとか、とにかくピュアなものとダーティなものが簡単かつ明確に区別できて、ピュアな領域を相対的に太らせることさえできれば何でもいいです。
class Pure:
"""
ピュアな関数をまとめたクラス
こっちを太らせます
"""
def plus(self,a,b):
return a + b
def minus(self,a,b):
return a - b
class Dirty:
"""
ダーティな関数まとめたクラス
=状態の変更を行う関数を持つクラス
こっちを減らします
"""
def __init__(self):
self.my_number = 0
def plus(self,a):
self.my_number = self.my_number + a
return self.my_number
def minus(self,b):
self.my_number = self.my_number - 1
return self.my_number
##どうしてピュアな領域を太らせるとデバッグ時間を減らせるの
理由は4点あります。
1.ピュアな関数は意図しない変数の変更をおこしません
2.ピュアな関数を修正する際に他への影響を考慮する必要がありません(その関数を正しくかけばいいだけ)
2.ピュアな関数であれば一つの関数が肥大化してもピュアであることを保てば分割及びその再利用が容易にできます
3.バグを生みやすいのはダーティな領域なので、これを小さく保てばあたりがバグのあたりがつきやすくなります
##関数型"言語"ってなに
関数型プログラミングを行うのが容易な言語です。
関数を取り扱う言語が豊富だったり、ピュアな関数で書くことに向いています。
関数型プログラミング自体はVBだろうがなんだろうができます。
##関数型プログラミングとオブジェクト指向の共通点及び違いは?
共通点のうち最も具体的な点は目的で、ある領域が他の領域に及ぼす影響を最小化することです。
オブジェクト指向は、カプセル化、ポリモフィズム、継承によってこれを実現しようとしています。
関数型プログラミングは、上記のようなピュアな関数を太らせて状態変更による問題を最小化しようとしています。
以下は極めて個人的な見解でバイアスがかかっている可能性があります
両者は背反な概念ではなく、共存可能な概念ですが、オブジェクト指向は、慣習的に、多くのオブジェクトの状態を変更することを前提としたつくりになりがちなので、上記の目的である「ある領域が他の領域に及ぼす影響を最小化すること」が達成しにくいです。
また、関数型プログラミングに比べてオブジェクト指向は学習コストや設計コストの割に成果を生みにくいと感じます。なので、時間とのトレードオフを意識して、ある程度のクラス分けはしつつも、私はほとんどPureかDirtyかにしか気を払いません。
##まとめ
関数型プログラミングの肝は、ピュアな領域を太らせること。
関数型プログラミングは、学習コストが爆安な割に効果が高く汎用的なおいしい技術です。