アカウント名:
パスワード:
>> 初心者に変数がグローバル変数だけと思わせるような筋、stdio.hをインクルードする理由を解説しない点についてはタレこみ人はどうかと思うが
これね、教えたことがない人のセリフ。教えると、こうするしか無いのよ(main()の外にint宣言おいてあるのはいただけないが)。
関数の概念の前にmain()関数があって、メモリの概念の前に"やscanfの&があったり、プリプロセッサの前に#includeがあったり、とどめ、printf()なんて可変長引数をとる、どう考えても最初に教えちゃいけない関数だったり。
ある程度目をつぶって教えるしかない場所なんですよ。で、ポインタやってから戻って「実はscanfの&は・・・」というように教えるしかない。main()の引数char** argvなんて・・・じゃん。
(main()の外にint宣言おいてあるのはいただけないが)。
それがまさに「初心者に変数がグローバル変数だけと思わせるような」ジャマイカ。このソースならローカル変数で書けるし、後々main()以外の関数を導入した際に説明が容易だと思う。
ここは、グローバル変数でよいと思いますよ。初心者なんですから、グローバルもローカルもわからないでしょ。おそらく、初心者にはローカルの概念が難しいと思われ、関数を教えるにせよ、最初はグローバルで教え、そのあと、ローカル変数を教えつつ、それぞれのスコープの違いなどの特徴を学ぶのがスムーズかと。
最初は、問題を単純化して覚えやすくするために、正しくないことでも、あえて正しいと教えることも多々ありますからね。
初心者はmain()以外の関数なんて分からない(少なくとも自分から作ろうとはしない)から, グローバルとローカルのいずれか一つで話を進めるならローカル変数だけにした方が後での実害は少ないです.
おそらくプログラマと称している人の半分程度は, 関数を作ることができないと考えておいた方が安全です.
マジすか?!じゃいったいそういう彼らは関数作らないで何を作るんで?
Cの場合、関数が作れないとバグも作れないゾwww
main関数のみでもバグは作れますよ。
例:http://srad.jp/developers/article.pl?sid=08/04/01/0451222 [srad.jp]
すみません。ネタがわかりにくくて。「main()も関数だから関数が作れなければmain()も作れなかろうwww」という揚げ足取り系小ネタでした。
基本的にはmain()関数, あるいは仕様書に提示されているエントリ関数(これもstubは事前に提供されることが多い)だけで, 内部的にはのべたんで記述します. それが1万行を越えたとしても, 決して複数の関数に分割することはありません.
関数とは彼らにとっては既存の機能を呼び出すために存在するもので, 自分で作成するものではないのです.
main()も関数…って茶々は他のコメントで入れたので置いておくとして。
それ書いてる本人は辛くないんですかね?main()に全部書いてねって言われたら、それは普通に書ける人にとってはむしろ拷問ですよねぇ?(関数がダメってことは多分関数型マクロはもっとダメですよね?)
かの史上初のプログラマブルな計算機である解析機関(機械式、残念ながら完成しなかった)にさえAda女史がサブルーチン・コールの仕掛けを入れようとしたという歴史もありますし、1万行にもなる場合、「必要は発明の母」的に関数書きたくなったりしませんかね?#高校生の頃(1980年代前半)、FORTRAN入門でズラズラ変数並べる代わりに配列を習った記憶があるけどそんな感じに。>「必要は発明の母」必要性・動機があれば学習は速そうなものですが…。
大昔のBASICしか知らないような人がlabelとgotoがあって良かったって言ってたのを思い出してアタマがまた痛くなった
main()に全部書いてねって言われたら、それは普通に書ける人にとってはむしろ拷問ですよねぇ?
私にとっても拷問です. でもここで気をつけなくてはならないのは, それが「普通」であるという認識が間違っている(かもしれない)ということです. 自称プログラマの内のかなりの割合が, 問題を論理的に分割して対応するよりも, 既存の処理パターンを高機能エディタやIDEで集積して一つの物にすることの方が簡単と思っている(らしい)ことです. 前者を解析型, 後者を集積型と呼ぶとすると, 解析型ではプログラミングに際して常に考えることを要求されるのですが, 集積型では仕様書に従ってパターンを並べていくだけなので考えなくてもよいということみたいです. ですからそんなプログラムを書く当人は, 苦労はするけど決して拷問とは考えていないみたいです.
ちなみに, さらに酷い拷問は, こうして作られたプログラムをメンテナンスさせられることです.
集積型というのは、単に恐い物しらずなだけだと思う。そういう集積型で作られたものはスパゲッティプログラムになりやすく、作った本人にもデバッグできなくなる。
解析型は将来を予測しながらコードを書くので、必要があれば解析型だけでなく集積型のスタイルを取ることもできる。しかし現実的にみて集積型のスタイルが望ましいことが滅多にないため、ほぼ全ての場合で解析型/分割統治型のスタイルを取ることになる。
名大、東工大、九大の学生さんたちや、某F社の研究所の同僚、先輩などプログラミングする人々を眺めてきましたが、本当に「main()に全部」をやった人を実地で見たことは(「笑い話」としては出てきても)なかったんですが、これは実はあんまり普通でない環境なんでしょうか?
## 職場環境の改善に自ら乗り出すって手もありだけれど…
以前、乗り出しました。プロジェクトのメインツールの作り直しの機会に。
といってもさすがに「main()に全部」な人は居なかったのでそこの改善ではなく「Unitテスト書きましょう運動」。「原理主義的だ!」とブツつかれつつも、結果として若干改善。
しかし今ひとつうまくモジュール化がなされた設計になってなかったので、結果としてテストしにくく、今ひとつテストが不十分なモジュールが発生・・・。現在担当者の異動によりそこを引き継いだのでリファクタリング中。
プロシジャ?
戻り値voidで結果をグローバル変数に格納とか、よく見かけちゃいます。
スパゲッティでは?
日本の4年生大学を卒業していて、関数という言葉は知っているはず(数学で出てきますから)なのに、それがプログラミングで出てくる「関数」と結びつかない、ってことはありますよ。やってることは数学の関数と同じなのに。
パラメータが複数あって、結果が一つだけ出てくるのだから、これは関数でしょ?で、関数として作っておけば、他から使い回せるでしょ?
って言っても、なかなか関数を作れない、ってのは、実際に新人教育で教えてみて半分以上いたし……
ただ、こういうのは、「処理を分割すること」がそもそもできてない。ある処理を、細かい処理の箇条書きにばらしてみることが上手くできないんですね。ここができるかどうかが、そのままプログラミングができるかどうかにつながるかと思います。
まぁでも、数学、特に解析学とかでやる関数は連続関数なんでイメージしにくいかもしれませんね。対応関係よりグラフとかのイメージのほうがどうしても鮮烈でしょうし、離散的な対応関係に拡張して考えるのは若干ギャップがあるのかもしれません。
もちろん連続関数も集合論的な意味での関数を基礎においていて、そこをわからないとちゃんと理解はできないとは思うんですが、離散数学とかやらないとイマイチ想像しにくいのかもしれません。工学部だと計算機関係に進まないと離散数学はやらないで解析方面だけで終わる可能性もありますからね。
また値の対応関係としての関数と計算手順として書かれた関数の関係も若干ギャップがある可能性もありますね。
プログラミングで出てくる「関数」と結びつかない
関数型言語をかじった立場で見れば、C言語の関数って数学的な関数とは、副作用のあるなしの所が全然違うんだもの。結びつかないのはある意味、当然じゃないですか?
私はC言語の"function"を「関数」って訳したのは結果的にあまり良くなかったと思ってます。今考えれば「機能単位」くらいかな。でも最初に「関数」って訳語をあてた時、C言語は「分かっている人が使う言語」でしたからね。そこは責められないし、関数という言葉が「分かっている人達」に広まった状況から別の言葉を使うと、更に現場で混乱しそう。じゃあどうすれば良かった、これからどうすればいいのかと言われると分かりませんが。
「C言語の関数って機能単位の事なんですよ、数学の関数とはちょっと違う」って研修の時に言うのかなぁ。
機能単位としてしまうと、「式の中に繰り込むことができる」というのが上手く表現できないと思います。結局、関数という訳語が一番なのではないかと。
関数が数値以外を返すことがある(もしくは何も返さない)ってとこにブレークスルーがあるのかなあ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
日本発のオープンソースソフトウェアは42件 -- ある官僚
とは言うけどね (スコア:4, 興味深い)
>> 初心者に変数がグローバル変数だけと思わせるような筋、stdio.hをインクルードする理由を解説しない点についてはタレこみ人はどうかと思うが
これね、教えたことがない人のセリフ。教えると、こうするしか無いのよ(main()の外にint宣言おいてあるのはいただけないが)。
関数の概念の前にmain()関数があって、メモリの概念の前に"やscanfの&があったり、プリプロセッサの前に#includeがあったり、とどめ、printf()なんて可変長引数をとる、どう考えても最初に教えちゃいけない関数だったり。
ある程度目をつぶって教えるしかない場所なんですよ。で、ポインタやってから戻って「実はscanfの&は・・・」というように教えるしかない。main()の引数char** argvなんて・・・じゃん。
-- gonta --
"May Macintosh be with you"
Re: (スコア:2, すばらしい洞察)
>> 初心者に変数がグローバル変数だけと思わせるような筋、stdio.hをインクルードする理由を解説しない点についてはタレこみ人はどうかと思うが
(main()の外にint宣言おいてあるのはいただけないが)。
それがまさに「初心者に変数がグローバル変数だけと思わせるような」ジャマイカ。
このソースならローカル変数で書けるし、後々main()以外の関数を導入した際に説明が容易だと思う。
Re: (スコア:4, 興味深い)
ここは、グローバル変数でよいと思いますよ。
初心者なんですから、グローバルもローカルもわからないでしょ。
おそらく、初心者にはローカルの概念が難しいと思われ、
関数を教えるにせよ、最初はグローバルで教え、
そのあと、ローカル変数を教えつつ、
それぞれのスコープの違いなどの特徴を学ぶのがスムーズかと。
最初は、問題を単純化して覚えやすくするために、
正しくないことでも、あえて正しいと教えることも多々ありますからね。
Re:とは言うけどね (スコア:3, すばらしい洞察)
初心者はmain()以外の関数なんて分からない(少なくとも自分から作ろうとはしない)から, グローバルとローカルのいずれか一つで話を進めるならローカル変数だけにした方が後での実害は少ないです.
おそらくプログラマと称している人の半分程度は, 関数を作ることができないと考えておいた方が安全です.
Re:とは言うけどね (スコア:1)
おそらくプログラマと称している人の半分程度は, 関数を作ることができないと考えておいた方が安全です.
マジすか?!
じゃいったいそういう彼らは関数作らないで何を作るんで?
Re:とは言うけどね (スコア:5, おもしろおかしい)
main()も関数だから (スコア:1)
Cの場合、関数が作れないとバグも作れないゾwww
Re: (スコア:0)
main関数のみでもバグは作れますよ。
例:http://srad.jp/developers/article.pl?sid=08/04/01/0451222 [srad.jp]
Re:main()も関数だから (スコア:1)
すみません。ネタがわかりにくくて。
「main()も関数だから関数が作れなければmain()も作れなかろうwww」という揚げ足取り系小ネタでした。
Re:とは言うけどね (スコア:1)
基本的にはmain()関数, あるいは仕様書に提示されているエントリ関数(これもstubは事前に提供されることが多い)だけで, 内部的にはのべたんで記述します. それが1万行を越えたとしても, 決して複数の関数に分割することはありません.
関数とは彼らにとっては既存の機能を呼び出すために存在するもので, 自分で作成するものではないのです.
Re:とは言うけどね (スコア:2, すばらしい洞察)
main()も関数…って茶々は他のコメントで入れたので置いておくとして。
それ書いてる本人は辛くないんですかね?
main()に全部書いてねって言われたら、それは普通に書ける人にとってはむしろ拷問ですよねぇ?
(関数がダメってことは多分関数型マクロはもっとダメですよね?)
かの史上初のプログラマブルな計算機である解析機関(機械式、残念ながら完成しなかった)にさえ
Ada女史がサブルーチン・コールの仕掛けを入れようとしたという歴史もありますし、
1万行にもなる場合、「必要は発明の母」的に関数書きたくなったりしませんかね?
#高校生の頃(1980年代前半)、FORTRAN入門でズラズラ変数並べる代わりに配列を習った記憶があるけどそんな感じに。>「必要は発明の母」
必要性・動機があれば学習は速そうなものですが…。
Re: (スコア:0)
.NET系だとイベントハンドラ内にゴリゴリ書かれてしまいますね。
そもそも教える側が関数/メソッドを切り出すための考え方を教えていないので
関数を書くと、追跡すべきコードが分散して読みにくくなるとしか思ってないと思います。
当然、教える側も分かってません。
Re: (スコア:0)
さすがに見たことがですけど、同じような処理をコピペで複数の関数に
撒き散らすってのは普通にあります。
おまえ、それ関数にしようよ、もしバグってたら全部直すの大変だよ、
と言うと、「あ、そうか!」という顔をします。
でも言われないと関数化しないんですよね。
Re: (スコア:0)
大昔のBASICしか知らないような人がlabelとgotoがあって良かったって言ってたのを思い出してアタマがまた痛くなった
Re:とは言うけどね (スコア:2, すばらしい洞察)
私にとっても拷問です. でもここで気をつけなくてはならないのは, それが「普通」であるという認識が間違っている(かもしれない)ということです. 自称プログラマの内のかなりの割合が, 問題を論理的に分割して対応するよりも, 既存の処理パターンを高機能エディタやIDEで集積して一つの物にすることの方が簡単と思っている(らしい)ことです. 前者を解析型, 後者を集積型と呼ぶとすると, 解析型ではプログラミングに際して常に考えることを要求されるのですが, 集積型では仕様書に従ってパターンを並べていくだけなので考えなくてもよいということみたいです. ですからそんなプログラムを書く当人は, 苦労はするけど決して拷問とは考えていないみたいです.
ちなみに, さらに酷い拷問は, こうして作られたプログラムをメンテナンスさせられることです.
Re: (スコア:0)
# 世の中(職場)に不満があるなら自分を変えろ。それが嫌なら耳と目を閉じ口をつぐんで孤独に暮らせ。それも嫌なら…
## 世の中(職場)からドロップアウト、ですかね。その後普通に書ける環境を探して転職する、と。
## 職場環境の改善に自ら乗り出すって手もありだけれど…
Re: (スコア:0)
集積型というのは、単に恐い物しらずなだけだと思う。
そういう集積型で作られたものはスパゲッティプログラムになりやすく、作った本人にも
デバッグできなくなる。
解析型は将来を予測しながらコードを書くので、必要があれば解析型だけでなく集積型の
スタイルを取ることもできる。しかし現実的にみて集積型のスタイルが望ましいことが
滅多にないため、ほぼ全ての場合で解析型/分割統治型のスタイルを取ることになる。
Re:とは言うけどね (スコア:1)
名大、東工大、九大の学生さんたちや、某F社の研究所の同僚、先輩などプログラミングする人々を眺めてきましたが、本当に「main()に全部」をやった人を実地で見たことは(「笑い話」としては出てきても)なかったんですが、これは実はあんまり普通でない環境なんでしょうか?
Re:とは言うけどね (スコア:1)
## 職場環境の改善に自ら乗り出すって手もありだけれど…
以前、乗り出しました。
プロジェクトのメインツールの作り直しの機会に。
といってもさすがに「main()に全部」な人は居なかったので
そこの改善ではなく「Unitテスト書きましょう運動」。
「原理主義的だ!」とブツつかれつつも、結果として若干改善。
しかし今ひとつうまくモジュール化がなされた設計になってなかったので、結果としてテストしにくく、今ひとつテストが不十分なモジュールが発生・・・。現在担当者の異動によりそこを引き継いだのでリファクタリング中。
Re:とは言うけどね (スコア:1)
プロシジャ?
戻り値voidで結果をグローバル変数に格納とか、よく見かけちゃいます。
Re:とは言うけどね (スコア:1)
スパゲッティでは?
Re:とは言うけどね (スコア:1)
日本の4年生大学を卒業していて、関数という言葉は知っているはず(数学で出てきますから)なのに、
それがプログラミングで出てくる「関数」と結びつかない、ってことはありますよ。
やってることは数学の関数と同じなのに。
パラメータが複数あって、結果が一つだけ出てくるのだから、これは関数でしょ?
で、関数として作っておけば、他から使い回せるでしょ?
って言っても、なかなか関数を作れない、ってのは、実際に新人教育で教えてみて半分以上いたし……
ただ、こういうのは、「処理を分割すること」がそもそもできてない。
ある処理を、細かい処理の箇条書きにばらしてみることが上手くできないんですね。
ここができるかどうかが、そのままプログラミングができるかどうかにつながるかと思います。
-- To be sincere...
Re:とは言うけどね (スコア:1)
まぁでも、数学、特に解析学とかでやる関数は連続関数なんでイメージしにくいかもしれませんね。対応関係よりグラフとかのイメージのほうがどうしても鮮烈でしょうし、離散的な対応関係に拡張して考えるのは若干ギャップがあるのかもしれません。
もちろん連続関数も集合論的な意味での関数を基礎においていて、そこをわからないとちゃんと理解はできないとは思うんですが、離散数学とかやらないとイマイチ想像しにくいのかもしれません。工学部だと計算機関係に進まないと離散数学はやらないで解析方面だけで終わる可能性もありますからね。
また値の対応関係としての関数と計算手順として書かれた関数の関係も若干ギャップがある可能性もありますね。
Re:とは言うけどね (スコア:1)
関数型言語をかじった立場で見れば、C言語の関数って数学的な関数とは、副作用のあるなしの所が全然違うんだもの。結びつかないのはある意味、当然じゃないですか?
私はC言語の"function"を「関数」って訳したのは結果的にあまり良くなかったと思ってます。今考えれば「機能単位」くらいかな。でも最初に「関数」って訳語をあてた時、C言語は「分かっている人が使う言語」でしたからね。そこは責められないし、関数という言葉が「分かっている人達」に広まった状況から別の言葉を使うと、更に現場で混乱しそう。じゃあどうすれば良かった、これからどうすればいいのかと言われると分かりませんが。
「C言語の関数って機能単位の事なんですよ、数学の関数とはちょっと違う」って研修の時に言うのかなぁ。
vyama 「バグ取れワンワン」
Re: (スコア:0)
Re:とは言うけどね (スコア:1)
機能単位としてしまうと、「式の中に繰り込むことができる」というのが上手く表現できないと思います。
結局、関数という訳語が一番なのではないかと。
関数が数値以外を返すことがある(もしくは何も返さない)ってとこにブレークスルーがあるのかなあ。
-- To be sincere...
Re: (スコア:0)