見出し画像

Retro-gaming and so on

酷い出題を見た

教えて!gooを眺めていたら酷い出題を見た。



さぁ、皆はどう答えるだろうか。
ちと考えてみて欲しい。

ポイントは「表示される結果をかきなさい」なんだが・・・・・・。

僕の答えはこうだ。

解答:

  1.  
  2.  

そう、「何も表示されない」だ。

随分と酷い出題者だ。Pythonを「良く分かってなくて」出題してる臭がプンプンしてる。

前にプロシージャの話をしたんだけど。
一般には、「オブジェクト指向」でいうメソッドは「手続き指向」だ。
つまり「返り値を持たない」(※1)。
Pythonは割に「フツーの言語」なんで、やはりメソッドは返り値を持たない。
結果、「破壊的変更」前提のメソッド適用で「表示される結果」なんざあり得ないんだ。


Pythonで「破壊的変更前提」のメソッドを用いると「何も表示されない」。
何故なら「破壊的変更前提」のメソッドには返り値がない、からだ。

じゃあ、「メソッド適用時」にprintすればどうなるだろうか。
やってみよう。


見た通りだ。Noneが印字される。
PythonでNoneが返る関数、とか「破壊的変更」目的のメソッドは全部「手続き的」あるいは「プロシージャ的」な動作を意味する。

おそらくこの問題は次のようにしてくれ、って意図だとは思う。



しかしながら問題文の指定は曖昧だし、なにより「出題者がPythonを理解してない」畏れがあるわけだ。
そしてハッキリ言っておく。こんなメソッドをプログラミング初心者に教えちゃならない、んだ。もうこの時点でメソッドを使ったプログラミングが面倒臭い、って思わないとならない。わざわざprintで「データを見なきゃならない」時点で面倒臭いし、これじゃあ返り値を利用してプログラミングする、と言う直球勝負な事が出来ない。
粋がって破壊的変更メソッドを使わせようとする、ってのが問題であって、この程度の「動作」なら次のように書いた方がスッキリする。



2番目の式はややこしく見えるだろう。しかし、ここでは実はnumと言う変数自体には全く手が加わってないんで、プログラミングとしては安全なんだ(※2)。



まぁ、とにかく、出題も教えてる事もお話になんない。
学校でこんなの教えて宿題出してるとすれば、学校で教えてる事もアテにならん、と言う一例だと思う(※3)。

※1: 一般的にはそうだ、という話であって、実際はプログラミング言語実装に拠る。
例えばプログラミング言語Rubyの場合だと、


このように、破壊的変更を行っても返り値がある(からインタラクティヴなirb上で「結果が表示される」わけだ)。
Rubyはこういう風に設計されてるんで、Pythonではあまり見かけない「メソッドチェーン」と言う技法が普遍化するわけだ。Rubyでは破壊的操作をしようとPythonで言うと return self しまくってる。

※2: Rustを知ってる人は、mutを付けない変数の動作を考えればいい。

※3: ここで挙げた「破壊的変更をしない」プログラミング法だと確かにメモリを多めに使い、そしてそれらを破棄する為にガベージコレクタが走り回り、その分のコストは間違いなく上昇する。
ただし、だ。それらを避ける為に最初から破壊的変更をする、ってのはドナルド・クヌースが言った「早すぎる最適化」であって、望ましくない。
まず最初は非効率だとしても安全なプログラムを書く。後にパフォーマンスで問題があったら「最適化する」でイイんだ。そういう開発プロセスを教えるべきであり、こういう意味不明な「良くわからん問題をやらせる」事自体が害悪なんだよ。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事