質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

1276閲覧

ミニマルなプログラム?

dixon0726

総合スコア11

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2016/09/30 00:28

編集2016/09/30 00:44

技術的な問題というよりは、言葉の定義をお聞きしたいです。

先日、「(C++で)ミニマルなプログラムを書く練習をした方がいい」 という発言を(通りすがりに)聞いたのですが、これは単純に、
・スクリプトをたくさん書いて練習しましょう
と解釈して良いでしょうか。

それとも「ミニマルなプログラム」には何か定義があるのでしょうか。

発言されていた方の職種が特殊で、少し憧れていたので定義があるのであれば今のうちに知っておきたいです。
英語でググっても釈然としなかったので質問させていただきます。
よろしくお願いいたしますmm

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matobaa

2016/09/30 00:37

文脈を確認したいのですが、「先日、「(C++で)ミニマルなプログラムを書く練習をした方がいい」 という発言」とはどこのどの発言のことでしょうか。 現場で先輩が……ということであれば、その先輩に聞くのが一番かと思います。
dixon0726

2016/09/30 00:40

それはおっしゃる通りです。ただ、今回は身内の人間ではなく、通りすがりに聞いた発言で、妙に印象に残りました。 その人はその場のノリで言葉を作ったのかもしれないのですが、その人の職種は特殊で少し憧れがあったので、定義があるのであれば今のうちに知っておきたいと思いました。
matobaa

2016/09/30 02:20 編集

ふむ。面白いですね。興味あります。
guest

回答3

0

ミニマルなプログラムを書く練習

たとえば、ジャンケンのプログラム(の一部)を書くとします。
「player」「computer」が「グー=1、チョキ=2、パー=3」の手を持ち、
「judge」が「引き分け=0、playerの勝ち=1、負け=2」と判定する仕様です。

C++

1#include <iostream> 2 3using namespace std; 4 5int main() { 6 7 int player = 1; 8 int computer = 2; 9 int judge = 0; 10 11 if(player == 1 && computer == 1){ 12 judge = 0; 13 }else if(player == 2 && computer == 2){ 14 judge = 0; 15 }else if(player == 3 && computer == 3){ 16 judge = 0; 17 }else if(player == 1 && computer == 2){ 18 judge = 1; 19 }else if(player == 2 && computer == 3){ 20 judge = 1; 21 }else if(player == 3 && computer == 1){ 22 judge = 1; 23 }else if(player == 2 && computer == 1){ 24 judge = 2; 25 }else if(player == 3 && computer == 2){ 26 judge = 2; 27 }else if(player == 1 && computer == 3){ 28 judge = 2; 29 } 30 31 std::cout << judge; 32 33 return 0; 34}

一番素直に書くと上のようになります。
可能な手の組み合わせの九通りを網羅しています。

switch文で書くとかいろいろ改善点はありますが、
ここでそれより、もっと短く書く方法があります。

c++

1if(p == c){ 2 j = 0; 3}else if((p== 1&&c ==2)||(p==2&&c==3)||(p==3&&c==1)) 4{ 5 j = 1; 6}else{ 7 j = 2; 8}

(判定部以外は同様の処理なので省略)
if文を工夫すると、あいこ、勝ち、負けの3パターンにできます。
しかし、さらに短くもできます。

c++

1((p==1&&c==2)||(p==2&&c==3)||(p==3&&c==1))?(j=1):(j=2); 2(p==c)&&(j=0);

三項演算子と短絡評価で二行まで縮まりました。

ruby

1(((p==1&&c==2)||(p==2&&c==3)||(p==3&&c==1))&&(j=1))||(p==c)&&(j=0)||(j=2)

Rubyのように値を評価して返す仕様の言語だと、一行で書けます。
(C++の仕様には詳しくないので、c++でも書き方があるかもしれませんが)


今見てきたような冗長さを省いて短縮していく道のりが、
「ミニマルなプログラムを書く練習」のひとつだと思います。

ただし、注意点があります。

ひとつは、現代のプログラミングは、
冗長さの短縮よりも可読性を重視する方向に進んでます。

『リーダブルコード』でも、行数を短くするよりも、
読んで理解するのにかかる時間を短くせよ、と言っていたと思います。

ですから、これは詰め将棋的にあえてする練習であって、
本番のプログラムでは読みやすさが大事ですから、
短さにこだわり過ぎた書き方はしない方がいいです。

今回の例だと、「あいこ、勝ち、負けの3パターン」
くらいまでが個人的な許容範囲でしょうか。

もうひとつ、「ミニマル」といっても、
コードゴルフ的に行数を減らすだけではないでしょう。

たとえば、『The ThoughtWorks Anthology』の
「オブジェクト指向エクササイズ」のように、
スモールオブジェクトに分解していく書き方も
一種のミニマリズムだと思います。

投稿2016/09/30 03:04

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dixon0726

2016/09/30 07:28

なるほど、具体的にありがとうございます!例まで用意していただいたので、よく理解できました。 冗長性の短縮と可読性の優先順位に関しては、よく覚えておこうと思います。 The ThoughtWorks Anthology、面白そうですね。 しかし、これがteratailでの初めての質問なのですが、素晴らしいコミュニティですね。 今後も煮詰まったら、質問を投げさせてもらおうと思います。
guest

0

こんにちは。

「ミニマルなプログラム」で検索したら、プログラムではないのですが、近そうなことが書いてあるサイトがありました。

プログラムを無用に複雑にしないようそれなりの努力を払うことには強く賛成です。
(油断するとあっと言うまに無用なコード、冗長なコードの山になります。)

投稿2016/09/30 01:14

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dixon0726

2016/09/30 02:00

ありがとうございます。ミニマルとは、抽象化して考えれば、必要最低限の操作で目的を表現する考え方、ということのようですね。プログラミングやデザインへの適応はその個別例になりそうです。 下記の方と合わせて、自分の中に整理がつきました。 ありがとうございます。
guest

0

ベストアンサー

一つの関数が長すぎるということではないのでしょうか。
それと、一つの関数の中で色んなことをしすぎているのかもしれないです。

なので、”関数を分解して小さくしてね。関数一つにつき仕事は一つだけやらせてね。”っていうことかもしれないです。

自分もよくわかっていませんが。。

「リーダブルコード」という本が参考になるかもしれません。
リンクは張っていいのかよくわからないので止めておきます。

その「リーダブルコード」を読んだ人の感想を張っておきます。
リーダブルコードを読んだので、殴り書き - Qiita

”こういう意味か”という答えを自分なりに用意して、その認識で合っているかを直接聞いた方が齟齬が無くていいかもしれないです。

投稿2016/09/30 00:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dixon0726

2016/09/30 00:46

回答ありがとうございます! ミニマル(最小限)という言葉はプログラミングでは多義的で人によっていろんな局面で使うのかもしれませんね。 「リーダブルコード」ですが、先日たまたま買って積んでいたところですので、読ませていただきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問