読書をしているときに、意図的なプログラミングと呼ばれるものに出くわしました。ある程度は理解できましたが、完全ではありません。誰かがそれをより詳細に説明できる場合は、してください。実際のアプリケーションで使用されていますか?
7 に答える
あなたは私にこれを始めさせました...
C.シモニーは、高水準言語から次のレベルの抽象化にステップアップしたかったようです。すべての変更を行う開発者への顧客の依存を減らします..コードで (開発していない人々にとってはわかりにくい) そこで彼は、ドメイン固有のモデルを作成するための WYSIWYG タイプの GUI エディターを備えた、IP と呼ばれるこの新製品を発明しました。(つまり、IP にはアプリのビルディング ブロックを作成するための GUI があります。LISP では、メタ/ビルディング ブロックを作成できましたが、ドメインの専門家が簡単に作成できる方法ではありませんでした。)
UML のモデルと同様に、約束されているのは、対応するソースコードを自動生成できます「ボタンを押すだけ」で。そのため、ドメインの専門家は将来的にモデルを微調整し、Bake ボタンを押してアプリの次のバージョンを配信できます。DSL を利用しているようですが、ユーザーが作成した複数の DSL が組み込みの IP メカニズムを介して相互に通信できるという追加の利点があります。これは、財務モデルと販売モデルが相互作用し、必要に応じてブロックを再利用できることを意味します。DSL と同様に、実装言語の制約を緩和するのではなく、開発者の意図を伝えるコードの利点が得られます。
アイデアは、何が必要かを実際に知っている BA とドメインの専門家により大きな制御を与えることです...
更新: 実際の使用は「まだ」のように見えますが、Simonyi は「長期的には絶対に」と考えています。
ショート ストーリー: MS は .Net フレームワークを支持して IP を押しつぶしました。 .. (それは彼を遅くするはずです)。それはまだ作業中だと思います..そしてC#で書かれています(起動するため)
ソース:
- あなたができることは何でも、私はメタを行うことができます スコット・ローゼンバーグ著、MIT Tech Review (2007)
昨日まで考えると.. 私はこれについて何も知りませんでした。調査記者のサインオフ。日常の仕事に戻ります:)
これは、パブがはしご酒を飲んだ後、午前2時に帰宅してラップトップを起動したときに起こることとは逆です 。
そして翌日、片目をはがして正午の割れ目でバスルームに行くと、歯を磨き始め、歯磨き粉が口から滴り落ちることに気づきました。昨夜、4つのSVNコミットを行い、閉じました。 3つのバグ、および分散ロックプロトコルの飢餓問題を解決する方法を見つけました。そして、私はそれがどのように機能するのかもうわかりません。
または多分それはworkmad3が言ったことです。
私は、意図的なプログラミングについて少し異なる理解を持っています (より一般的な用語として、Charles Simonyi が行っていることだけではありません)。これは、流暢なインターフェースと密接に関連しており、さまざまな難易度で、現代のオブジェクト指向言語で実現できます。
これらの概念のいくつかは、ドメイン駆動設計に由来します (実際、「流暢なインターフェース」という用語は、「ドメイン駆動設計: ソフトウェアの中心にある複雑さを解決する」という青書の著者であるエリック エヴァンスによって広められました)。
目的は、非プログラマー (つまり、ビジネスマン) がビジネス層のコードを読めるようにすることです。これは、操作の意図を明示的に示すクラス名とメソッド名によって実現できます。私の意見では、明示的で意図的なものにすることで、非常に読みやすく保守しやすいコードが生成されます。
同じことを達成する以下の 2 つの例を考えてみましょう - 10% 割引で顧客の注文を作成し、それにいくつかの製品を追加します。
//C#, Normal version
Customer customer = CustomerService.Get(23);
Order order = new Order();
//What is 0.1? Need to look at Discount property to understand
order.Discount = 0.1;
order.Customer = customer;
//What's 34?
Product product = ProductService.Get(34);
//Do we really care about Order stores OrderLines?
order.OrderLines.Add(new OrderLine(product, 1));
Product product2 = ProductService.Get(54);
order.OrderLines.Add(new OrderLine(product2, 2)); //What's 2?
Order.Submit();
//C#, Fluent version
//byId is named parameter, states that this method looks up customer by Id
ICustomerForOrderCreation customer =
CustomerService.GetCustomerForOrderCreation(byId: 23);
//Explicit method to create a discount order and explicit percentage
Order order = customer.CreateDiscountOrder(10.Percent())
.WithProduct(ProductService.Get(byId: 34))
.WithProduct(ProductService.Get(byId: 54))
.WithQuantity(2); //Explicit quantity
Order.Submit();
プログラミング スタイルを少し変更することで、意図をより明確に伝えることができ、何が起こっているのかを理解するために別の場所でコードを確認する必要がなくなります。
これは、プログラマーの意図を言語の制約された構文に強制するのではなく、プログラマーが言語に実際にあるものを拡張して、元の意図により忠実に従うことを可能にするプログラミング方法のようです。
これをサポートする言語として LISP が明示的に言及されているので、この優れた言語について読むことをお勧めします :) LISP マクロはまさにこの記事で説明されているものであり、言語を無期限に拡張して、気にかけているほとんどすべてをカバーすることができます。表現するために。(大規模な LISP システムのかなり一般的な結果は、特定のアプリケーションを作成するのに非常に適したドメイン固有言語になってしまうことです。つまり、ワード プロセッサを作成すると、ワード プロセッサ固有の言語になってしまいます)。
最後の部分については、はい、LISP (および意図的なプログラミング) が一部のプロジェクトで使用されています。Paul Graham は LISP の偉大な支持者であり、その他の例にはオリジナルのクラッシュ・バンディクーが含まれます (LISP PlayStation コンパイラを含む、ゲーム オブジェクト作成システムが LISP で作成されました)。
私には、ソフトウェア エンジニアリングのもう 1 つの流行のように思えます。メタ プログラミング、ジェネレーティブ プログラミング、ビジュアル プログラミングなど、すでに何千ものものを見てきました。しばらくの間、それらは非常にファッショナブルになり、人々はどこでもそれを使用しますが、その後、常に古いソフトウェア作成方法に戻ります。
なんで?Frederick Brooksは 20 年以上前にこの質問に答えています。
意図的なプログラミングは、あなたの意図や目標をコード化しています。したがって、それは目標指向のプログラミングまたは計画です。経営にステップアップ。
それはあなたがプログラミングしようとしている場所であり、偶然にそれを行うだけではありません。;)