なんか考えてることとか

変な人が主にプログラミング関連で考えていることをまとめる。

「行数の少ないコード」信仰者による、非常に読みやすいプログラムの書き方

注意
この記事は私怨や戒めを込めたネタ記事です。こんな記事を真に受けず、マサカリは投げないようお願いいたします。
もっと読みにくく、イラつかせるアイデアは大歓迎です。

コードの行数は少ないほうが良いに決まっている。コードが読みにくくなる?そんなわけはない。今回は、いくつか行数の少ないコードを例示することで、「行数の少ないコードは世界で一番読みやすいこと」を証明しようと思う。

言語はCとする。

例1: Hello Worldプログラム

まずはHello Worldプログラムから見ていこう。

#include<stdio.h>
int main(){return printf("Hello, World!"),0;}

素晴らしい。

2行目を見てほしい。とても読みやすい。1行読めば良いので、「main()関数でprintf("Hello, World!")を実行し、0を戻り値として返している」ということがすぐわかる。

一つ言うことがあるとすれば、Cという言語では #includeを使うと必ず改行しなければならないという人類史上最悪のクソ仕様があり、なぜそのような仕様にしたのかまったく理解できないのだが、そういう仕様になってしまっているのだからしょうがないだろう。

例2: FizzBuzzプログラム

FizzBuzzプログラムとは、以下のようなプログラムである。

  1. 1以上の整数値を入力する
  2. 1から入力値まで以下のプログラムを繰り返す
    • 数値が3の倍数の場合、 "Fizz"を出力
    • 数値が5の倍数の場合、"Buzz"を出力
    • 数値が3の倍数かつ5の倍数の場合、"FizzBuzz"を出力
    • 数値が3の倍数でも5の倍数でもない場合、数値をそのまま出力
  3. プログラム終了

みんなはFizzBuzzプログラムのコードを読みにくいと思ったことはないだろうか?私はずっと思っていた。なぜなら、条件分岐で改行しまくっているからである。
改行しまくっているコードはこの世から消えるべきだ。そこで、私は改行を極力しないFizzBuzzプログラムのコードを考えた。それがこれである。

#include<stdio.h>
int main(){unsigned long long n=0;printf("1以上の整数値を入力してください:"),scanf("%lld",&n);for(unsigned long long i=1;i<=n;++i)(i%15)==0?printf("FizzBuzz "):(i%3)==0?printf("Fizz "):(i%5)==0?printf("Buzz "):printf("%lld ",i);return 0;}

綺麗すぎる。

ところで、察しの良い人は気づいていると思うが、標準入出力面でも私は抜かりない。scanf()改行しないといけないという人類史上最悪のクソ仕様があるせいで仕方なく改行しているが、その後の入出力では、改行の代わりにスペースを用いている。これによって、標準入出力においても、極力改行しないようなプログラムを作ることが可能である。

1以上の整数値を入力してください:42
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 

コードも1行で書かれているので、すぐにFizzBuzzを行っていることがわかる。

例3: 単方向線形リスト

行数が多く書かれているせいで非常に読みにくいことで有名な線形リストも、行数を少なくすれば非常に読みやすくなる。
まず単方向線形リストとは、以下のようなデータ構造である。

単方向線形リスト
  • 1つ1つの関連したデータを「要素」として、それらを順につなげたものが
    「線形リスト」である
  • 「単方向」は、先頭から末尾までの行き先が一方通行であることを示す。

単方向線形リストは、以下の要件を満たすものとする。

  1. データの型はunsigned int
  2. データは途中、末尾への追加(push)・取り出し(pop)が可能

単方向線形リストの実装例を以下に示す。

#include<stdlib.h>
typedef struct _List{unsigned int data;struct _List*next;}List;List*element_create(unsigned int data){List*list=(List*)calloc(1,sizeof(List));return list->data=data,list;}void element_destroy(List**list){free(*list);*list=NULL;}List*list_create(unsigned int data[],size_t data_count){List*list=NULL,*current=NULL,*push=NULL;for(size_t i=0;i<data_count;++i)push=element_create(data[i]),list!=NULL?(current->next=push,current=push):(list=push,current=list);return list;}void list_destroy(List**list){if(*list!=NULL){for(List*next=(*list)->next;;*list=next,next=next->next){element_destroy(list);if(next==NULL)break;}}}void list_push(List**list,unsigned int data){for(;*list!=NULL;list=&(*list)->next);*list=element_create(data);}void list_insert(List**list,size_t index,unsigned int data){for(size_t i=0;i!=index;list=&(*list)->next,++i)if(*list==NULL)return;if(*list==NULL)*list=element_create(data);else{List*tmp=*list;*list=element_create(data),(*list)->next=tmp;}}long list_pop(List**list){long result=-1;if(*list!=NULL){List*next=(*list)->next;if(next==NULL){result=(*list)->data;element_destroy(list);return result;}for(;next->next!=NULL;list=&(*list)->next,next=next->next);result=next->data;element_destroy(&(*list)->next);}return result;}long list_remove(List**list,size_t index){long result=-1;if(*list!=NULL){List*next=(*list)->next;if(index==0){result=(*list)->data;element_destroy(list);return *list=next,result;}for(size_t i=1;i!=index;list=&(*list)->next,next=next->next,++i)if(next==NULL)return result;if(next!=NULL){List*tmp=next->next;result=next->data;element_destroy(&next);(*list)->next=tmp;}}return result;}

美しい。

これも#includeとかいうクソのせいで2行になってしまっているが、2行目は単方向線形リストの実装であるため1行読めばすぐにわかる。
今回の実装では、単方向線形リスト(以降リスト)を操作する以下の関数が定義されている。

  • リストを生成するlist_create()
  • リストの末尾に追加するlist_push()
  • リストの途中に追加するlist_insert()
  • リストの末尾を取り出すlist_pop()
  • リストの途中を取り出すlist_remove()
  • リストを破棄するlist_destroy()

それが1行でわかるのだから、やはり行数の少ないコードは神である。

終わりに

いかがだっただろうか。

コードの行数を少なくすることで、非常に読みやすくなることがわかっただろう。

これさえわかれば、ソフトウェア開発を100%理解したも同然であり、これに文句を言う奴はソフトウェア開発者を名乗る資格はない。

これらを踏まえると、ソフトウェア開発は世界で一番簡単な仕事だということがわかる。故に、未経験でも1年足らずで書けるようになるだろう。

























By ソフトウェア開発未経験