##はじめに
私は趣味で iPhone アプリを開発している51歳のアマ・プログラマーです。
プログラミングを始めたきっかけは36年前(中学生時代)に兄が「日立ベーシックマスターJr.」というパソコンを買ったことです。使用していた言語は BASIC という手続き型言語でした。当時はインターネットもメールもなく、パソコンといえば「自分でプログラムを書かなければ動かない、ただの箱」でパソコンを買った人は必然的に BASIC を習得していました。
Mac や Windows が出現してパソコンが「GUI でネットやメールをする道具」に変貌してからはプログラミングを止めていました。
40歳を過ぎた頃、ネットで iPhone アプリのプログラムを目にした時に感じたことは「for や if が使われている所は BASIC と似てるな。これなら自分でも書けるんじゃないか」ということです。以来 iPhone アプリ開発を趣味としています。
本稿では「手続き型」「関数型」「オブジェクト指向」についての私見を書いてみました。(対象言語は swift です)
##手続き型
「 if を使った条件分岐」と「 for を使った繰り返し」を組み合わせて全てのアルゴリズムを表現する方法です。BASIC ではどんな複雑なプログラムも if と for の組み合わせで書かれていました。逆にいうと if と for を組み合わせればどんな複雑なアルゴリズムも実現できる、ということです。(こういうのをチューリング完全というのでしょうか)
覚えることが少ないので習得のハードルが低く、35年前にNHK教育テレビで放映されていた BASIC 講座では小学生からおじいさんまで登場してプログラムを書いていました。
##関数型
簡単に言うと、map, filter, reduce を使って、なるべく if や for を使わないようにする手法です。(単純化しすぎでしょうか・・・)
UISearchController を使った tableView の検索で
func updateSearchResults(for searchController: UISearchController) {
if let searchText = searchController.searchBar.text, !searchText.isEmpty {
filteredArray = unfilteredArray.filter {
$0.lowercased().contains(searchText.lowercased())
}
}
tableView.reloadData()
}
のように filter を使うと、とても便利です。
if や for の多重ネストが map や filter で1行に収まるとプログラムがすっきりします。
##オブジェクト指向
swift で iPhone アプリを開発する時は、オブジェクト指向を特に意識しなくても存分にオブジェクト指向の恩恵を受けています。
iPhone 画面上のパーツ(Label, Button, SegmentedControl)などはそれぞれ、UILabel, UIButton, UISegmentedControl などのクラスのインスタンスとして定義されます。
Label に
myLabel.text = "Hello, world!"
などのメッセージを送ると UILabel クラスの内部を知らなくても実行されます。
我々が UILabel クラスの内部を覗いたり、書き換えたりすることはありません。(こういうのを隠蔽・カプセル化というのでしょうか)
tableView から画面遷移するアプリでは1画面あたり1つのViewController クラスが割り当てられますが、クラス同士が干渉することがないので同じ変数名を複数の ViewController クラス内で使用しても問題がありません。
##おわりに
以上、アマ・プログラマーより私見を述べさせていただきました。
プロの方々から補足をいただければ幸甚です。