プログラムには書き方が複数ある
私は新しいプログラミング言語を学ぶとき、最初に5冊程度本を買います。
しかし、結局本だけでプログラミングが出来るようになったことはありません。
結局、ネットで検索するんですよね。このブログもそういう人向けに書いています。
しかし、どうして結局ネットで調べるのに、わざわざ本を買うのか。
プログラミングには処理としては同じことなのに、書き方がたくさんあります。
略して書いたり、書き方が違うと記述順の制約が付いたりするのですが、やってることは同じなんです。それでも書き方が違うんです。
特に、ネット上の情報は書く人によって、ごっちゃごちゃになっているので、それらのコードを読む技術を本から得ようとしている感じですね。
例えば、PHPの条件分岐の書き方
条件分岐と言えば、IF文です。
PHPで条件分岐を使うことは多いでしょうが、これも書き方が複数あります。
基本的なIF文
<?php
$city = "tokyo";
$str = "tokyo";
// $cityと$strを比較
if ($city == $str) {
echo "<p>cityとstrは一致します。</p>";
} else {
echo "<p>cityとstrは一致しません。</p>";
}
こちらが一番ベーシックなIF文だと思います。
基本に忠実ですが、慣れてくるとちょっと野暮ったい書き方かなって思っちゃいます。
Kindle Unlimitedの本なんかはページ数を稼ぐためにわざとこういう書き方をしている物があります。
カッコの無いIF文
if文では判定後の処理が1命令しかない場合、カッコを外せるので、ここからカッコを取り払ったバージョンが存在します。
<?php
$city = "tokyo";
$str = "tokyo";
// $cityと$strを比較
if ($city == $str) echo "<p>cityとstrは一致します。</p>";
else echo "<p>cityとstrは一致しません。</p>";
// 条件に一致する時だけ処理するなら1行で済む
if ($city == $str) echo "<p>cityとstrは一致します。</p>";
行数が減りました。
この場合、カッコがないので、最後の閉じカッコもないです。
コードを圧縮するためにこういう書き方がされている場合があります。
if~endifパターンのIF文
先ほどまではechoで出力していましたが、echoではエディタも文字列として認識するため、出力内容をHTMLで記述したい時があります。
そういう場合、if(~~): else: endif;の構文を使います。
<?php
$city = "tokyo";
$str = "tokyo";
// $cityと$strを比較
if ($city == $str): ?>
<p>cityとstrは一致します。</p>
<?php else: ?>
<p>cityとstrは一致しません。</p>
<?php endif; ?>
カッコでも同じようにPHPを途中で切れるのですが、最後が中カッコだけになるので、何の終わりなのかわからなくなってしまうので、こういう書き方をする時はendifを使うのが良いです。
例えば、WordPressで良く出てくる記事取得処理を比較してみましょう。
<h2>お知らせ</h2>
<?php
$the_query = new WP_Query(array(
'~~' => '~~',
'~~' => '~~',
));
if ($the_query->have_posts()) { ?>
<ul>
<?php while ($the_query->have_posts()) {
$the_query->the_post(); ?>
<li>
<a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php } ?>
</ul>
<?php } else { ?>
<p>現在、掲載されているお知らせはありません。</p>
<?php }
wp_reset_postdata(); ?>
<h2>お知らせ</h2>
<?php
$the_query = new WP_Query(array(
'~~' => '~~',
'~~' => '~~',
));
if ($the_query->have_posts()): ?>
<ul>
<?php while ($the_query->have_posts()):
$the_query->the_post(); ?>
<li>
<a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endehile; ?>
</ul>
<?php else: ?>
<p>現在、掲載されているお知らせはありません。</p>
<?php endif;
wp_reset_postdata(); ?>
いかがでしょうか?
このコードではif文とwhile文が出てくるので、最後から2行目の『}』が単発で出てくる所とか、一瞬「なんの閉じカッコ?」ってなると思います。
これをendifと記述しておくことで、if文だけを辿っていけばよくなるので、可読性が上がります。
ifを使わないIF文
さらに別パターンがありまして、ifって書かないIF文もあります。
<?php
$city = "tokyo";
$str = "tokyo";
// $cityと$strを比較
echo ($city == $str)? "<p>cityとstrは一致します。</p>": "<p>cityとstrは一致しません。</p>";
これはifって書いてないので、ぱっと見IF文であると認識しづらいのですが、IF文です。
さすがに参考書ではあまり見ませんが、ネットのコードではたくさん出てきます。
さらに、pタグの出力と文章のかぶっている所が冗長なので、必要な部分だけ判定で出力するようにしてみましょう。
<?php
$city = "tokyo";
$str = "tokyo";
// $cityと$strを比較 ?>
<p>cityとstrは<?php echo $city == $str? "一致します": "一致しません"; ?>。</p>
最終的に5行使ってたIF文が1行になりました。
ifっていう記述すら無くなってしまいました。
このように、結果は同じでも書き方がたくさんあるのがプログラミング学習の難しい所だったりするのかなと思います。
例えば、javascriptの関数定義
javascriptの関数定義も複雑化しています。
というか、javascriptに関してはライブラリやフレームワークがたくさんあるので、情報を読み解く力がかなり試されます。
基本的な関数定義
// 2つの引数の文字が一致するか判定する簡単な関数
function str_compared(str01, str02) {
return str01 == str02? true: false;
}
console.log(str_compared("tokyo", "tokyo"));
2つの引数を比較して、コンソールに結果を表示するプログラムです。
これが基本的な関数定義です。
先ほど、PHPのIF文の話で出てきた条件分岐がjavascriptでも使えます。
無名関数
無名関数という物が出てきます。
関数に関数名を付けるのは、一度関数を定義しておいて、あとで呼び出す時に名前がないと、どの関数を呼ぶのかわからなくなりますよね。
なので、何の関数を呼び出そうとしているのか判別するために関数名を付けるのですが、javascriptでは変数に関数を代入したり、関数の引数に変数ではなく関数を求められることがあり、「この関数の引数でしか使わない関数」というのが発生します。
そんな用途が絞られているなら、名前無しで直接代入したら良いじゃん。ということで無名関数という物が登場します。(たぶん)
// 変数に関数を代入
var cmp = function str_compared(str01, str02) {
return str01 == str02? true: false;
}
console.log(cmp("tokyo", "tokyo"));
// 変数に関数を代入(関数名無し)
var cmp = function(str01, str02) {
return str01 == str02? true: false;
}
console.log(cmp("tokyo", "tokyo"));
上記のサンプルプログラムは左が普通に関数を変数に代入して使っている例。
変数に代入された関数を呼び出す時には、関数ではなく、変数名を使っている点に注目してください。
変数名で呼び出せるなら、代入する関数に一々名前を付けたってどうせ使わないんじゃんか!関数名を付けるのはやめだ!って関数名を付けるのをやめたパターンが右側のサンプルです。
両方動きます。
こうして、名前も無き関数が生まれます。
jQueryを書いたことある人なら見覚えがあるんじゃないでしょうか?
$(function() {
// ページ表示時に実行する内容
});
これも無名関数です。
即時関数
名前のない関数が出てきましたが、今度は定義した関数をすぐに実行する『即時関数』という物が生まれました。
(function(str01, str02) {
return str01 == str02? true: false;
}("tokyo", "tokyo"));
定義して、すぐ実行します。
カッコが多くてわかりにくいですが、無名関数をカッコで囲って、関数の後ろには実行を表すカッコがもう1セット出てきます。
アロー関数式
このあたりから、初心者に優しくなくなってくるのですが、functionって書かない関数の記述方法です。
// アロー関数式を定数に代入する
const my_name_is = (name) => {
return "私の名前は" + name + "です。";
}
console.log(my_name_is("taro"));
// 引数がない場合
const echo = () => {
console.log("check point");
}
// 実行する時
echo();
functionっていう記述が無くなりました。
functionの代わりに、=>が書かれるようになっています。
プログラミング言語によっては、これを「ラムダ式」って言うのかな?
さらに、これを省略して書くことが出来ます。
// 1行処理なら、{}を消せます。
// returnも消せます。
// 引数が1つの場合、()も不要になります。
const my_name_is = name => "私の名前は" + name + "です。";
console.log(my_name_is("taro"));
const echo = () => console.log("check point");
echo();
というわけで、以下の2つは書き方が全然違うけど、同じことをしています。
function str_compared(str01, str02) {
return str01 == str02? true: false;
}
console.log(str_compared("tokyo", "tokyo"));
const str_compared = (str01, str02) => str01 == str02? true: false;
console.log(str_compared("tokyo", "tokyo"));
これらのルールが書く人、使っている言語、記述する状況によって、バラバラに存在している状態なので、そりゃプログラミング学習難しいわって、僕も思います。
もしお困りごとがありましたら、お問い合わせフォームよりご相談ください。