Setelah membaca buku The Pragmatic Programmer , salah satu argumen yang saya temukan paling menarik adalah "tulis kode yang menulis kode".
Saya mencoba mencari di internet untuk penjelasan lebih lanjut atau artikel tentang itu, dan sementara saya menemukan beberapa artikel bagus tentang masalah ini, saya masih belum menemukan implementasi kode spesifik atau contoh yang baik.
Saya merasa itu masih bukan argumen yang begitu umum, sesuatu yang tidak memiliki dokumentasi atau tidak dianut oleh begitu banyak orang, dan saya ingin tahu lebih banyak tentang itu.
Apa pendapat Anda tentang subjek ini? Apakah ini sesuatu yang benar-benar akan meningkatkan produktivitas Anda? Apa sajakah sumber yang bagus tentang masalah ini, di antara buku, blog, tayangan slide, dll?
Beberapa contoh kode akan sangat dihargai untuk memungkinkan saya lebih memahami implementasinya.
Inilah halaman wiki tentang masalah ini dengan berbagai teknik pemrograman yang relevan, seperti Pemrograman Meta, Pemrograman Generatif, dan Pembuatan Kode.
sumber
Jawaban:
Di dunia Lisp, sangat umum untuk melihat kode yang menulis kode yang menulis kode (dan seterusnya). Jadi, setiap proyek Lisp atau Skema berukuran layak akan menjadi contoh kode yang baik. Saya akan merekomendasikan melihat sumber Racket compiler dan runtime, serta Bigloo , perpustakaan mereka hanya brilian.
Adapun produktivitas: Saya menggunakan metaprogramming sebagai teknik dominan di hampir semua pekerjaan pengembangan saya, dan itu jelas banyak membantu, baik mengurangi ukuran kode dan meningkatkan keterbacaannya. Kuncinya adalah dalam menggunakan Bahasa Khusus Domain , dan pemrograman program adalah salah satu cara paling efisien untuk mengimplementasikannya.
sumber
Saya lebih suka melangkah lebih jauh, dan, alih-alih menulis kode yang menulis kode, menulis kode yang menghasilkan objek, metode, fungsi. Ini dapat dicapai dengan Lisp macro atau kemampuan modifikasi program dinamis Ruby misalnya.
Perbedaan kecilnya adalah Anda tidak berakhir dengan file sumber yang dibuat secara otomatis. Biasanya file-file ini tidak dapat dibaca manusia dan tidak dapat dimodifikasi, jadi mengapa repot-repot dengan mereka. Saya tidak suka gagasan meningkatkan basis kode saya dengan sesuatu yang tidak dapat saya kendalikan.
Satu buku yang saya suka baca tentang topik itu adalah Metaprogramming Ruby (jika Anda tahu bahasa Ruby)
Edit setelah pertanyaan berikut dalam komentar:
Pertama, metaprogramming bukan tujuan, tetapi alat. Jangan gunakan metaprogramming karena "itu keren" atau "X mengatakan setiap pengembang harus menggunakannya".
Saya pikir salah satu alasan bagus untuk menggunakan metaprogramming adalah untuk menggeneralisasi beberapa pola umum (pola sebagai sesuatu yang berulang) yang telah Anda temukan dalam kode Anda dan bahwa tidak ada teknik pemrograman biasa lainnya (pewarisan, pola desain, dll.) Yang dapat dicapai.
Seperti yang dikatakan oleh Jordan , satu kasus penggunaan yang umum adalah penanganan basis data dan ORM (Object Relation Mapping). Sekali lagi, di Ruby, Anda harus melihat ActiveRecord yang merupakan contoh bagus dari program metaprogram yang diterapkan pada ORM.
Sebagai catatan akhir:
Jangan berpikir "Saya ingin menerapkan metaprogramming, di mana saya bisa menerapkannya dalam kode saya?".
Pikirkan "Saya melihat pola ini yang berulang di seluruh kode saya, saya tidak dapat menemukan cara untuk memperbaiki kode menjadi sesuatu yang lebih kecil dan lebih dapat digunakan kembali. Mungkin metaprogramming dapat membantu saya?"
sumber
Lebih baik lagi, gunakan kode yang ditulis orang lain yang menulis kode Anda untuk Anda.
Otomatisasi kode umumnya baik untuk ORM dan kode interaksi basis data lainnya, dan tentu saja untuk pembuatan kode yang berulang tetapi serupa.
Tentu saja, jika Anda membangun banyak kelas yang mirip, mungkin Anda bisa menyelesaikan hal yang sama dalam bahasa yang dinamis lebih cepat, tapi saya ngelantur.
Ini dianut oleh banyak orang, meskipun Anda akan sering menemukan perangkat lunak yang berlabel pembuat kode.
Lihat perusahaan dan produk seperti CodeSmith dan MyGeneration, atau telusuri di artikel Wikipedia ini: http://en.wikipedia.org/wiki/Comparison_of_code_generation_tools
sumber
Salah satu contoh klasik adalah lex dan yacc. Tujuan utama mereka adalah menghindari pekerjaan menulis parser yang membosankan. Sepanjang jalan, mereka membuatnya jauh lebih cepat untuk membangun parser kompleks dengan banyak aturan dan negara, dan mereka juga menghindari semua kesalahan kejutan yang dilakukan oleh orang-orang yang menggulirkannya sendiri.
Ini juga ide di balik c, yang merupakan alat untuk menulis assembler. Hal yang sama berlaku untuk setiap bahasa tingkat tinggi yang ingin Anda beri nama. Untuk alat yang menulis kode untuk Anda, ada beberapa paradigma sederhana.
IDE yang tepat membantu dengan menyediakan dokumentasi di ujung jari Anda, penyelesaian otomatis pintar, dan cuplikan kode. IDE juga menyertakan berbagai templat, jadi Anda tidak harus memulai program dari awal. Ada beberapa program untuk mengambil diagram uml dan kelas kasar dalam bahasa tingkat tinggi.
Akhirnya, Anda bisa menulis alat sendiri untuk menghasilkan kode dalam set masalah Anda. Ini adalah bagaimana lex dan yacc pertama kali dimulai. Jenis bahasa tertentu domain ada untuk alasan ini. Anda membuat beberapa blok bangunan yang menggambarkan solusi Anda dalam kode yang lebih mudah dipahami, menyelesaikan kegiatan umum, atau bagian yang rumit dengan perintah sederhana. Anda tidak mencari solusi untuk setiap masalah, hanya definisi yang lebih mudah dari yang spesifik yang Anda hadapi.
Dalam arti tertentu, semua yang Anda lakukan di atas lapisan biner adalah otomatisasi kode.
sumber
Metaprogramming
Metaprogramming adalah teknik kontroversial di banyak toko. Alasannya, seperti alat yang ampuh, besarnya bantuan atau luka sangat besar.
Pro
Cons
Saya besar penggemar metaprogramming, tapi aku sudah melakukannya untuk waktu yang lama. Bagi saya tradeoff pengurangan ukuran kode dan perilaku yang konsisten lebih dari menebus risiko. Lebih sedikit kode berarti lebih sedikit bug, lebih sedikit kode untuk dipelihara, dan saya biasanya dapat menambahkan fungsionalitas besar dengan sangat cepat.
Namun, ini tidak berarti saya pikir semua programmer harus terlibat di dalamnya. Saya telah melihat dan harus memperbaiki masalah besar yang diciptakan oleh metaprogramming. Biasanya sejak saat orang yang tidak memahami konsep dan telah berusaha untuk memperluas fungsionalitas, atau hanya memperbaiki bug. Dibutuhkan pola pikir tertentu yang berorientasi paling detail. Pertanyaan untuk menggunakan teknik metaprogramming harus menjadi keputusan tim . Jika Anda memiliki anggota tim yang tidak mengerti, tidak memiliki temperamen untuk itu, atau hanya menentangnya tidak ada tim yang harus menggunakan metaprogramming.
sumber
Sebagian besar kode menulis kode. Misalnya kode php membantu menulis html. Perpustakaan php pdo membantu menulis panggilan SQL. File I / O berfungsi menulis kode untuk berkomunikasi dengan OS. Bahkan panggilan fungsi biasa adalah referensi ke blok kode lain yang dijalankan. Jadi panggilan fungsi Anda menulis kode.
Dalam istilah yang luas, kita dapat menganggap komputasi sebagai kode penulisan yang menulis kode secara rekursif membentuk tumpukan yang berakhir ketika ia berhadapan dengan realitas fisik dari kode yang disambungkan ke perangkat keras.
sumber
Bagaimana Anda melakukan ini bervariasi tergantung pada persyaratan Anda. Dengan asumsi Anda menggunakan pembuatan kode statis, Anda dapat menulis sendiri semua infrastruktur, atau Anda dapat menggunakan generator yang ada seperti CodeSmith atau MyGeneration. Dengan menggunakan ini, Anda hanya perlu menulis templat yang diperlukan.
Proyek terakhir saya yang melibatkan ini adalah beberapa layar dasar ASP.NET CRUD (pembuatan kode bagus untuk ini). Proses selanjutnya mendefinisikan entitas sebagai metadata dalam file xml. Tulis templat untuk mencakup berbagai artefak yang diperlukan (kelas entitas, repositori, kelas layanan, kontrol asp.net, halaman asp.net dll.). Jalankan proses generasi dan gaya output.
Ada beberapa overhead dalam menulis template tetapi mereka dapat digunakan kembali untuk proyek serupa berikutnya. Demikian pula perubahan pada data yang mendasarinya ditangani dengan mengubah metadata dan menjalankan kembali pembuatan yang membuat perubahan lebih sederhana dan lebih cepat untuk diterapkan.
Adapun pengujian. Karena ini adalah sistem templated, Anda perlu meluangkan waktu pada awalnya memvalidasi output dari proses, jika template Anda salah semua output dari template itu akan sama salah. Setelah Anda puas dengan ini, Anda juga dapat menggunakan generator kode untuk membuat tes dasar dari metadata xml yang kemudian dapat diperluas untuk mencakup kasus-kasus khusus. Namun ingat Anda mungkin masih perlu melakukan tes kode untuk memenuhi hal-hal tertentu, pembuatan kode mengurangi pekerjaan Anda, tidak menghilangkannya sama sekali.
sumber
Di perusahaan kami, kami menggunakan beberapa alat yang benar-benar menghasilkan kelas C ++ atau C # dengan data yang diunduh dari internet. Kelas-kelas ini adalah wadah data dan berisi sejumlah besar objek dalam daftar.
sumber
Metaprogramming telah menjadi bagian dari pemrograman untuk waktu yang lama. Pertimbangkan tidak hanya alat seperti SWIG, atau desainer WYSIWYG, yang membuat kode, tetapi juga alat dalam bahasa seperti preprocessor C, atau bahkan templat C ++ dan generik C # / Java - belum lagi Refleksi.
Bahkan, Anda bisa berpendapat bahwa setiap kompiler hanyalah metaprogram lain - mereka mengambil teks program dan mesin output atau kode VM. Dan, hidup tanpa penyusun? Owch.
sumber
Ini contoh nyata dari masa lalu saya.
Saya sedang bekerja di sebuah situs yang memiliki sekitar 50MB kode sumber Delphi menggunakan BDE untuk akses data. Mereka ingin beralih menggunakan Direct Oracle Access untuk memungkinkan pembaruan Oracle melewati versi tertinggi yang didukung oleh BDE (8i jika saya ingat dengan benar).
Jadi, alih-alih membuat tim coders untuk bekerja melalui setiap formulir dan modul data mengubah setiap komponen secara manual, saya menulis skrip PERL yang: -
Parsing DFM (file formulir) dan identifikasi semua objek TQuery, TTable, TStoredProcedure & TDatabase - menyimpan item dalam daftar.
Parsing PAS (kode) dan identifikasi penggunaan objek - apakah TQueries melakukan pembaruan atau memilih? Juga, itu mengidentifikasi objek yang dibuat dalam kode daripada jatuh ke formulir di IDE.
Tulis ulang DFM & PAS yang mengubah tipe objek dengan tepat (mis. TTable -> TOracleDataSet dengan properti SQL diatur ke "select * from" dll) dan pemanggilan metode. Selain itu, panggilan metode tambahan ditambahkan jika sesuai untuk menutup, membuka & mengatur parameter.
Singkatnya, 3 minggu bekerja tweaker skrip untuk bekerja pada aplikasi yang berbeda yang ditulis oleh tim yang berbeda dengan gaya pengkodean yang berbeda, bukan perkiraan asli 5+ pengembang yang bekerja selama 6 bulan.
Dan alasan saya bahkan berpikir untuk menggunakan pendekatan itu adalah melalui membaca The Pragmatic Programmer
sumber
Anda meminta contoh ....
Ketika bekerja dengan SQL, Anda seharusnya tidak mengubah database secara langsung, tetapi sebaliknya seharusnya mengeksekusi skrip yang membuat perubahan apa pun yang Anda inginkan, termasuk perubahan struktural ke database (menambahkan tabel, kolom, kunci utama, batasan, dan sebagainya) . Cukup sering Anda perlu melakukan tindakan yang sama terhadap banyak tabel atau kolom pada saat yang sama, dan melakukannya satu per satu akan membosankan, skrip pendek yang menghasilkan skrip yang lebih besar yang melakukan apa yang Anda inginkan dapat menjadi nyata penghemat waktu.
Misalnya, sebelum tipe data DATE diperkenalkan ke MS SQl Server, satu-satunya pilihan untuk kolom tanggal adalah DATETIME yang memiliki bagian waktu - bagian waktu yang membuat berurusan dengan data sedikit lebih sulit. Setelah memutakhirkan ke versi dengan tipe data tanggal, Anda mungkin ingin memperbarui kolom di mana waktu selalu 00:00. Dalam database dengan lusinan atau bahkan ratusan kolom DateTime ini akan cukup memakan waktu. Tetapi mudah untuk menulis skrip yang menanyakan semua tabel, memeriksa setiap kolom dengan tipe data DATETIME untuk melihat apakah waktunya sama dengan pukul 00:00 dan jika tidak membuat pernyataan ALTER untuk tabel / kolom untuk diubah tipe data ke DATE. Presto, kode yang menulis kode.
sumber
Lihatlah makro CL (Common Lips). Menurut saya itulah yang Anda inginkan. Bibir sempurna dalam metaprogramming.
Saya juga menyarankan Nemerle jika Anda ingin memiliki kekuatan .NET dengan dukungan Metaprogramming yang sempurna (termasuk makro)
Tetapi jika Anda ingin mesin pembuat kode yang benar lihatlah penghematan Apache
sumber
Saya hanya mengerjakan alat seperti itu. Dalam kasus khusus kami, kami menghasilkan kode VB.NET berdasarkan untuk Layer Data pada tanda tangan fungsi dalam database.
Mulai bekerja dan dengan pembuatan kode sulit pada awalnya karena Anda tidak tahu bagaimana kode harus dihasilkan, tetapi begitu Anda memiliki seperangkat aturan yang ditetapkan, dan kode yang harus dihasilkan selalu dapat dihasilkan berdasarkan aturan-aturan itu , bekerja dengan kode itu tidak terlalu sulit. Tentu saja, tergantung pada kerumitan pembuatan kode dan pada jumlah aturan, tugas bisa menjadi lebih sulit. Tetapi pada dasarnya, pembuatan kode otomatis digunakan untuk tugas pengkodean berulang dan bukan untuk kode lanjutan yang sangat bervariasi.
Menguji output ada dua. Pertama, Anda harus memastikan bahwa kode dikompilasi, dan itu mudah. Maka Anda harus memastikan bahwa output melakukan apa yang Anda maksudkan berdasarkan parameter yang dihasilkan .. dan kesulitannya bervariasi pada kompleksitas kode yang Anda hasilkan.
Rekomendasi tulus saya adalah bahwa jika Anda merasa seperti Anda menulis kode secara berulang , dan Anda dapat membayar waktu .. Cobalah untuk berpikir jika apa yang Anda lakukan tidak dapat dilakukan dengan kode yang dihasilkan. Dan jika demikian (jika itu kode berulang dari hampir selalu terjadi) pikirkan berapa kali Anda harus memperpanjang, sedikit modifikasi kode itu dan juga berapa kali Anda harus menulis kode yang tepat. Jika jawaban untuk semua ini adalah "banyak" maka Anda harus serius mempertimbangkan membuat generator untuk kode itu .
Semoga itu bisa membantu,
IPP
sumber
Saya memiliki modul PHP yang menampilkan halaman web yang berisi kode JavaScript yang menghasilkan HTML. Itu tiga lapisan di sana. Bocah itu susah dibaca!
Di kelas pemrograman, kami harus menulis sebuah program yang akan mengambil string rumus dari pengguna dan menguraikannya dan menampilkan nilai. Pemecah yang paling mengesankan hanya mengambil input pengguna, membungkusnya dengan main () {printf ("% d", ...);} dan menjalankan skrip untuk mengkompilasi, menautkan, dan menjalankannya. Dia tidak menulis parser! Hari ini Anda bisa melakukannya dalam pernyataan SQL SELECT.
Ini adalah alat yang harus Anda mainkan, kemudian simpan untuk beberapa hari di masa depan ketika itu akan berguna.
sumber
Saya telah mengembangkan solusi meta-programming yang rapi dengan Prolog . Di mana aplikasi utama (dalam C ++ say) menerjemahkan definisi abstrak dari masalah ke dalam aplikasi Prolog saat runtime, yang kemudian didelegasikan ke. Seringkali menulis fungsionalitas yang setara dalam C ++ akan berlangsung selamanya.
Saya pikir skenario ini adalah kasus yang sangat baik dalam mendukung argumen penulisan kode-kode .
sumber
Apa pendapat Anda tentang subjek ini?
Metaprogramming umumnya dikaitkan dengan bahasa non-dinamis, karena ada waktu yang sulit dalam mencapai perilaku tertentu (seperti menerapkan ORM) tanpa banyak baris kode yang tidak produktif dan tidak cerdas.
Tetapi bahkan dalam bahasa yang lebih dinamis seperti PHP, pembuatan kode dapat benar-benar menyelamatkan hidup dan meningkatkan produktivitas dalam jumlah besar. Dalam kerangka kerja modern, sangat umum untuk memiliki perancah yang menghasilkan sebagian besar model, bentuk, pengujian, dan tindakan umum untuk objek bisnis tertentu yang Anda nyatakan. Ini adalah salah satu alasan mengapa kerangka kerja seperti symfony atau RoR begitu sukses, alat-alat penghasil kode membuat kode yang konsisten dengan sangat cepat dan meningkatkan produktivitas pemrogram.
Di situs web, sebagian besar interaksi berkisar pada empat tindakan utama:
Setidaknya semua yang berputar di sekitar ini 4 tindakan utama bisa dan IMHO HARUS dicapai menggunakan alat generasi kode untuk mencapai produktivitas maksimum.
Di perusahaan saya, kami menggunakan symfony, dan generator-adminnya adalah alat yang luar biasa, yang bahkan menghasilkan kode dalam run-time (dan menyimpannya), yang berarti kami bahkan tidak perlu menggunakan jenis tugas atau alat eksternal untuk menghasilkan kode baru, kita hanya perlu membersihkan cache kita. Saya SANGAT menyarankan untuk menggunakan alat semacam ini untuk operasi CRUD.
Tapi, melakukan apa yang kontributor hebat symfony lakukan, bukanlah tugas yang mudah. Saya sendiri telah mengimplementasikan beberapa tugas pembuatan kode dan melakukan sesuatu yang benar-benar konsisten dan dengan implementasi luas untuk mencakup sebagian besar kasus sudut tidak mudah.
Apakah ini sesuatu yang benar-benar akan meningkatkan produktivitas Anda?
Saya percaya bahwa metaprogramming sangat sangat penting dalam pekerjaan tingkat rendah (kerangka kerja, caching, kompiler, dll.) Tetapi sesuatu yang harus kita dekati dengan sangat hati-hati jika kita melakukan sesuatu pada lapisan bisnis.
Menggunakan generasi kode tanpa pertanyaan merupakan pendorong produktivitas utama. Menerapkan alat penghasil kode Anda sendiri, tidak terlalu banyak kecuali Anda membuat kerangka kerja sendiri.
Apa sajakah sumber yang bagus tentang masalah ini, di antara buku, blog, tayangan slide, dll?
Sumber daya terbaik untuk memahami pemrograman selalu baik dan kode sumber berkomentar dengan baik. Saya akan mengatakan bahwa melihat generator admin RubyOnRails dan Symfony adalah ide yang bagus.
sumber
Sementara banyak jawaban di sini merujuk pada apa yang umumnya dikenal sebagai pemrograman meta, sebenarnya ada bidang yang terkait dengan AI yang dikenal sebagai pemrograman otomatis yang membahas tentang pemahaman program atau program sintesis [1].
Setiap kompiler (atau program-meta, pembuat kode, penerjemah, sistem makro, ...) bekerja dengan transformasi, menghasilkan output dari input dengan melakukan algoritma transformasi tetap. Tetapi compiler atau meta-program tradisional tidak, dengan memberikan definisi, deskripsi atau contoh dari pengurutan suatu daftar (mis. [5, 3, 9] => [3,5,9]), membuat algoritma pengurutan. Masalah seperti itu di mana kepentingan bidang "pemrograman otomatis" ini.
[1] - Laporan kemajuan sistem pemahaman program ftp://db.stanford.edu/pub/cstr/reports/cs/.../CS-TR-74-444.pdfShare
sumber
Pemrograman meta bisa sangat sulit untuk dipertahankan. Pada awalnya terlihat elegan, tetapi ketika Anda mulai berlari ke dalam kasus sudut, kesalahan ditemukan terlambat (pada kode yang telah dihasilkan), dan semuanya menjadi mimpi buruk untuk digunakan / debug.
Saya terutama menulis kode python, dan dalam pengalaman saya pemrograman meta selalu merupakan pilihan yang buruk dengan bahasa ini. Anda selalu dapat memperbaiki hal-hal untuk melakukannya dengan fitur bahasa normal yang membosankan. Hasilnya tidak terlalu funky, tetapi lebih mudah dijalani.
sumber
OP meminta sumber daya.
Anda mungkin menemukan Perangkat Rekayasa Perangkat Lunak DMS kami menarik. Ini adalah alat metaprogramming murni, yang dimaksudkan untuk membiarkan orang membangun analisis program kustom dan alat transformasi.
[Untuk mengikuti komentar pada pertanyaan OP, ketika digunakan untuk membangun alat transformasi tertentu, DMS adalah lini produk yang menulis kode, yang menulis kode:]
DMS mencapai ini dengan menjadi agnostik (tetapi tidak independen) dari bahasa pemrograman target. DMS menyediakan layanan standar yang dibutuhkan oleh beragam tugas metaprogramming, seperti halnya OS menyediakan beragam layanan untuk tugas pemrograman standar. Layanan ini termasuk penguraian yang kuat, konstruksi otomatis pohon sintaksis abstact, pencocokan pola dan penulisan ulang pada pohon, perpustakaan tabel simbol yang dengan mudah mengelola langauges dengan aturan pelingkupan yang buruk seperti beberapa pewarisan, aliran kontrol, aliran data, aliran data, poin-to dan panggilan analisis grafik. Tidak satu pun dari hal ini yang berarti karena tidak ada bahasa khusus untuk diproses, sehingga DMS menerima definisi bahasa yang terkait dengan bagian-bagian mesin yang umum ini, menghasilkan penguraian khusus bahasa, konstruksi AST, pencocokan / penulisan ulang pola bahasa spesifik menggunakan target- sintaks bahasa,
Dan seperti OS, DMS dirancang untuk memiliki sangat sedikit pendapat atau kendala pada program (meta) apa yang ingin Anda tulis, yang berarti dapat digunakan untuk berbagai tujuan: mengekstraksi metrik, menemukan kode mati, menerapkan aspek penenun, menerjemahkan bahasa, menghasilkan kode dari DSL, menyusun ulang aplikasi besar. (DMS sudah digunakan untuk semua tugas ini).
Seseorang membutuhkan definisi bahasa yang kuat jika Anda tidak ingin menghabiskan waktu untuk mengkodekan semua yang ada di manual referensi langauge (pikirkan apa artinya ini untuk Java dan C ++). DMS memecahkan masalah ini dengan memiliki perpustakaan definisi bahasa lengkap yang tersedia. Analog di sini agak seperti memiliki avaialbe database untuk OS Anda; Anda tidak harus mengimplementasikan salah satu dari mereka untuk melanjutkan dengan menulis aplikasi berbasis database Anda.
sumber
Lihat kumpulan masalah 4 dari Philip Greenspun dari MIT course 6.916: Rekayasa Perangkat Lunak dari Layanan Web Inovatif ( http://philip.greenspun.com/teaching/psets/ps4/ps4.adp ).
Tujuannya mengatakan, "Ajari siswa kebajikan metadata. Lebih khusus lagi, mereka belajar bagaimana secara formal mewakili persyaratan layanan Web dan kemudian membangun program komputer untuk menghasilkan program komputer yang mengimplementasikan layanan itu."
Ini adalah salah satu masalah yang ditetapkan calon ArsDigita ( http://en.wikipedia.org/wiki/ArsDigita ) yang harus diselesaikan oleh karyawan selama gelembung pertama.
"SQL untuk Web Nerds" buku referensi Philip di pset telah dipindahkan ke ( http://philip.greenspun.com/sql/ ).
sumber
Pada atau sekitar tahun 2001 saya mulai mengerjakan proyek yang banyak menggunakan objek bisnis dan objek data. Saya akan membangun situs web front-end, tetapi digantung memutar-mutar ibu jari saya karena lapisan bisnis dan lapisan akses data tidak sepenuhnya dikembangkan. Setelah beberapa minggu, saya mulai melihat dengan cermat apa yang dilakukan lapisan-lapisan itu. Pada dasarnya, mereka mengekspos data yang dikembalikan dari prosedur tersimpan sebagai koleksi objek dengan properti yang sesuai dengan bidang dalam data, atau mengambil parameter input dan mengirimkannya ke prosedur tersimpan untuk disimpan ke tabel database. Ada banyak serialisasi / deserialisasi yang terjadi di antara dua lapisan, ada Microsoft Transaction Server yang terlibat, perpustakaan tipe IDL / ODL ... tetapi semuanya sesuai dengan pola.
2 minggu kemudian, saya berhasil membuat generator kode yang akan membuang IDL / ODL, dan juga akan membuang objek bisnis dan data. Butuh orang membangun bisnis dan lapisan data objek 2 tahun untuk sampai pada titik debugging dan menguji benda-benda ini. Dalam 2 minggu, dengan pembuatan kode, kami memiliki output yang sama, tetapi karena semuanya dihasilkan, bug-nya cukup bagus.
Pembuat kode itu (alat KASUS tingkat rendah) mengikuti saya berkeliling melalui banyak iterasi yang berbeda, selama sekitar 8 hingga 10 tahun, karena prinsipnya sangat sederhana: Anda melakukan sesuatu yang perlu dilakukan ketika berbicara dengan basis data, cukup banyak kode berulang, dan sekali Anda melakukannya dengan benar, Anda tidak perlu khawatir lagi.
Jadi, ya: gunakan generator kode, terutama ketika pengkodeannya berulang dan cocok dengan pola yang jelas.
Saya tahu orang-orang menggunakan makro RegX untuk melakukan hal serupa, atau menggunakan rumus Excel untuk melakukan hal serupa (saya juga melakukan ini).
sumber
Contoh pemrograman metap
Saya memiliki perpustakaan otorisasi Ruby yang disebut Otoritas . Ini memungkinkan pengembang mengajukan pertanyaan di aplikasi mereka dengan metode seperti
current_user.can_read?(@post)
dan@post.readable_by?(current_user)
. Pertanyaan-pertanyaan ini dijawab oleh kelas otorisasi terpusat.Ini adalah bagian penting: Otoritas tidak tahu metode mana yang harus didefinisikan sampai ia melihat konfigurasi pengguna . Konfigurasi pengguna mungkin berisi:
Dalam hal ini, perlu ada metode seperti
current_user.can_microwave?(@post)
.Metaprogramming memungkinkan ini: setelah membaca konfigurasi, saya tahu metode mana yang harus didefinisikan :
sumber