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

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

ただいまの
回答率

90.33%

  • プログラミング言語

    702questions

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

  • アルゴリズム

    427questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

  • メタプログラミング

    2questions

メタプログラミング(コードジェネレーターの作成)の使い所、やりどころがイメージできない

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 361

manzyun

score 2072

 背景

現在のチームのリーダーさんに、
「コードジェネレーター作るの良いですよ! 震え上がります」
と指導を受けまして、実際にGoで作ったコードジェネレーターのコードを拝見させて頂いたりして、
「メタプログラミング(コードジェネレーターもメタプログラミングの一つと思って)、すごく便利そうだなあ」
と思った次第です。

 質問

しかしながら、メタプログラミングについてサーチエンジンで自分が調べた限りだと、やはり思っていたより簡単では無く、
むしろ どういった状況 で どういった考え(設計) に至ると、メタプログラミングのテクニックを使う場面に出くわすだろうと、
頭の中でイメージしているばかりで、なかなか実装する機会を見つけられずにいます。

 現状の自分の理解

HTTPリクエストでDBからデータを取り出し、それをJSONやXMLで返すAPIの設計や、
APIから返ってきたJSONデータやXMLを元にHTMLで整形したデータを表示する(これはテンプレートエンジンになると思いますが)。

といったところで、
「コードを書くのがかったるいなあ……」
というときにメタプログラミングのテクニックを使って、コードを自動生成するものだと思っています。

しかし、自分の見てきた資料を眺めてみると、

  • 動的に移譲を実装する
  • プログラム実行中にメソッドや関数をクラスに追加する

などと書かれていて、
「そこまで高度な事をする必要があるのだろうか。あるとしたらどういった事例の時だろうか」
と、メタプログラミングに対してとてつもなく高度な印象を抱いています。

実際に高度なスキルとは思いますが、やはりちょっとSchemeやNimやPythonなど、メタプログラミングをサポートしている言語を触った程度で、
メタプログラミングを実際にしていなければ身につくようにはならないスキルなのでしょうか。


漠然とした質問で申し訳ありませんが、

「メタプログラミングはこういうときに使えるぜ!」
とか、
「いや、メタプログラミングそこまで難しく考えなくていいし」
など、むしろ、
「専門学校卒業程度で、ちょっと色んな言語のコードが読み書きできるだけの人間ができるわけねえだろ、大学行ってコンピューターサイエンス学んでから出直してこい」
や、
「メタプログラミングとコードジェネレーターは全く違う」
といった厳しいご意見でも構いませんので、
どういった状況 で どういった考え(設計) に至ると、メタプログラミングのテクニックを使う場面に出くわすか」
「メタプログラミングに取り組む際に必要な考え方・メタプログラムの設計手法」
などを、ご指導いただけると幸いです。

 参考資料

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

こんにちは。

「コードを書くのがかったるいなあ……」
というときにメタプログラミングのテクニックを使って、コードを自動生成するものだと思っています。

私もそう思います。C++のテンプレートは一種のメタプログラミングですが、型だけが異なる同じコードを何度も書かないで済ませるために開発されたものですね。

・動的に移譲を実装する
・プログラム実行中にメソッドや関数をクラスに追加する
「そこまで高度な事をする必要があるのだろうか。あるとしたらどういった事例の時だろうか」

リフレクションを使えば可能ですが、どちらかというと「邪道」に属する使い方と思います。
使ってはいけないという意味ではなく、使うメリットがない時まで使うのは如何なものか?程度の意味です。動的にプログラムを修正するとメンテナンス性が大きく劣化しますから。

「いや、メタプログラミングそこまで難しく考えなくていいし」

これが正解ですね。C言語のマクロだって一種のメタプログラミングですよ。
同じことを何度も書きたくない時によく使います。
メタプログラミングって意外に身近なものなのですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/27 17:16

    > C++のテンプレートは一種のメタプログラミングですが、型だけが異なる同じコードを何度も書かないで済ませるために開発されたものですね。

    C++のテンプレートは、そういうものだったのですね。昔はその恩恵がわからなかったけど、今ならとてもわかりそうです。

    > 使うメリットがない時まで使うのは如何なものか?

    ということは、必要と思えない・いつ使うかわからない今の時点では、分かっていればなお良いけれど、無理に理解する必要はなさそうですね。

    > C言語のマクロだって一種のメタプログラミングですよ。
    同じことを何度も書きたくない時によく使います。
    メタプログラミングって意外に身近なものなのですよ。

    C言語のマクロもそういう解釈でいいのですね。
    「Lispにもマクロってあるなあ。でも難しそう」

    とちょっと前までろくに調べていませんでしたが、意外とメタプログラミングって身近なのですね。

    キャンセル

0

JavaScript を使って html を生成するのが一番馴染みがあると思います。
データベースを解析して ORM オブジェクトのクラスを生成したり、ドラッグ & ドロップで作成した UI をコードに変換したり、活躍の場面は色々あります。

しかし当然どの場面でも使えるようなものでもないので、使いにくい時は使わないのが最適解ということが多いでしょう。

チームリーダーのそれは「趣味」です。
真似なくてはいけないものではありませんし、使う必要のないところに無理やり導入するものでもありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/27 14:32

    Visual Studioでのウィンドウ設計やデータセット定義も、コードは打っていないもののメタプログラミングですね!

    とはいえ、使いにくいと思ったら使わないというのも最適解なのですね。

    リーダーさんの趣味といえば確かに趣味ですし、本人も自認しています(笑)
    個人的に調べていると、「メタプログラミングは適量で」という文句をよく見たので、やはり無理やり導入するものでは無いのですね。

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • プログラミング言語

    702questions

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

  • アルゴリズム

    427questions

    アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

  • メタプログラミング

    2questions