Hanya kerana bosan, sementara menunggu sesi temuduga susulan saya, saya membina perpustakaan mesin negara, dikuasakan oleh genruler. Saya membina satu pada masa lalu, tepatnya, semasa kerja pertama saya selepas tamat pengajian. Pelaksanaan ini secara longgar berdasarkan reka bentuk yang digubal oleh penyelia saya ketika itu. Projek ini juga bertujuan untuk mempamerkan cara peraturan DSL boleh digunakan.
Menurut ringkasan berguna yang dikembalikan oleh carian Google pada mesin keadaan terhingga (penekanan saya)
A “mesin keadaan terhingga” bermaksud model pengiraan di mana sistem hanya boleh berada dalam bilangan keadaan berbeza yang terhad pada bila-bila masa dan peralihan antara keadaan ini dicetuskan oleh input tertentu, pada asasnya membenarkan ia untuk memproses maklumat berdasarkan satu set syarat yang ditetapkan tanpa kemungkinan mempunyai bilangan keadaan yang tidak terhingga; “terhingga” di sini merujuk kepada set terhad kemungkinan keadaan sistem boleh wujud dalam.
Pustaka menerima kamus yang mewakili skema mesin keadaan terhingga. Sebagai contoh, kami ingin membina sistem penjejakan pesanan
Rajah mesin keadaan terhingga yang dijana oleh Graphviz
Dan skema akan kelihatan seperti ini (dalam bentuk YAML yang dipotong untuk kejelasan)
machine: initial_state: pending_payment states: pending_payment: name: pending payment transitions: order_authorization: name: order is authorized destination: authorized rule: (condition.equal (basic.field "is_authorized") (boolean.tautology)) authorized: name: authorized action: authorize_order transitions: order_partially_paid: name: order is partially paid destination: partially_paid rule: (boolean.tautology) order_fully_paid: name: order is fully paid destination: paid rule: (boolean.tautology) ...
Oleh itu, untuk menetapkan segala-galanya, kami memanggil
import genstates import yaml import order_processor with open("states.yaml") as schema: machine = genstates.Machine(yaml.safe_load(schema), order_processor)
Jadi dalam contoh fiksyen ini, kami akan menerima beberapa muatan apabila terdapat perubahan dalam pesanan. Sebagai contoh, apabila penjual mengakui pesanan, kami mendapat
{ "is_authorized": true, ... }
Kami kemudiannya boleh menyemak melalui perpustakaan
state = machine.initial # assume the order is created transition = machine.get_transition(state, "order_authorization") assert transition.check_condition(payload)
Semakan juga menjalankan semakan pengesahan tambahan jika ditakrifkan dalam skema. Ini berguna jika anda berhasrat untuk mengembalikan mesej ralat kepada pemanggil.
try: assert transition.check_condition(payload) except ValidationFailedError as e: logger.exception(e)
Kadangkala, kita tahu bahawa setiap kali muatan tiba, ia sepatutnya mencetuskan peralihan, tetapi kita tidak selalu tahu yang mana satu. Oleh itu, kami hanya menyampaikannya ke Machine.progress
try: state = machine.progress(state, payload) except ValidationFailedError as e: logger.exception(e)
Setelah mengetahui keadaan apa yang pesanan itu harus berkembang, kita boleh mula menulis kod untuk bekerja pada logik
# fetch the order from database order = Order.get(id=payload["order_id"]) current_state = machine.states[order.state] # fetch next state try: new_state = machine.progress(current_state, payload) except ValidationFailedError as e: # validation failed, do something logger.exception(e) return except MissingTransitionError as e: # can't find a valid transition from given payload logger.exception(e) return except DuplicateTransitionError as e: # found more than one transition from given payload logger.exception(e) return # do processing (example) log = Log.create(order=order, **payload) log.save() order.state = new_state.key order.save()
Sebaik-baiknya, saya juga boleh mengekstrak logik pemprosesan, itulah sebab saya mengimport pesanan_pemproses pada mulanya. Dalam definisi keadaan kebenaran, kami turut menentukan tindakan
authorized: name: authorized action: authorize_order ...
Jadi dalam modul order_processor, kami mentakrifkan fungsi baharu yang dipanggil authorized_order
def authorize_order(payload): # do the processing here instead pass
Supaya perkara berikut mungkin berlaku, apabila kod pengurusan negeri dipisahkan daripada logik pemprosesan yang lain
machine: initial_state: pending_payment states: pending_payment: name: pending payment transitions: order_authorization: name: order is authorized destination: authorized rule: (condition.equal (basic.field "is_authorized") (boolean.tautology)) authorized: name: authorized action: authorize_order transitions: order_partially_paid: name: order is partially paid destination: partially_paid rule: (boolean.tautology) order_fully_paid: name: order is fully paid destination: paid rule: (boolean.tautology) ...
Walau bagaimanapun, saya masih mengusahakannya sekarang dan harus melakukannya dalam keluaran seterusnya. Sementara itu, ia juga mampu melakukan sesuatu yang serupa dengan memetakan dan mengurangkan jika setiap negeri mempunyai tindakan yang ditentukan. Sila semak projek untuk kemajuan pembangunan. Dan kedua-dua genruler dan genstates kini menggunakan PyPI, yay!
Saya memuat turun Codeium Windsurf selepas perpustakaan agak boleh digunakan. Saya akhirnya menggunakannya untuk menghilangkan kebergantungan dari genruler, dan menambahkan dokumentasi dan README pada projek itu. Untuk genstates, saya menggunakan lata untuk menghasilkan dokumentasi, README, serta ujian. Secara keseluruhannya, rasanya saya mempunyai pengaturcara pertengahan hingga senior untuk membantu saya menyelesaikan tugasan yang akan saya berikan kepada pelatih saya atau pun junior.
Kebanyakan logik teras masih datang dari hujung saya, secerdik model bahasa pada masa ini, mereka masih melakukan kesilapan di sana sini dan oleh itu, memerlukan pengawasan. Saya juga bereksperimen dengan model qwen2.5-coder:7b, dan ia berfungsi dengan baik, walaupun agak perlahan disebabkan stesen kerja saya yang buruk. Saya dapati harga yang diminta oleh Codeium adalah adil, jika saya ingin membina produk saya sendiri dan berjaya menjana wang daripadanya.
Walaupun bahagian penjanaan berfungsi dengan baik, tetapi menulis kod sebenar tidaklah sehebat itu. Saya tidak pasti sama ada Pylance berfungsi dengan baik di sana, menganggap ia adalah hak milik, atau sama ada ia disebabkan oleh penyiapan windsurf ajaib, editor saya tidak lagi dapat melakukan auto-import perpustakaan apabila saya menulis kod. Sebagai contoh, apabila saya melengkapkan fungsi reduce() secara automatik dalam kod saya, dalam vscode ia akan memasukkan secara automatik daripada import functools reduce ke dalam kod saya. Walau bagaimanapun, ini tidak berlaku dalam luncur angin, yang menjadikannya sedikit menjengkelkan. Walau bagaimanapun, memandangkan ini adalah baharu, pengalaman pengekodan harus diperbaiki dari semasa ke semasa.
Sebaliknya, saya masih mencari editor yang lebih ringan, dan zed memang menarik perhatian saya. Walau bagaimanapun, sejak Surface Book 2 saya meninggal dunia baru-baru ini, saya hanya tinggal dengan Samsung Galaxy Tab S7FE apabila saya jauh dari pejabat rumah saya. Oleh itu, vscode dengan frontend web (dan ia boleh digunakan secara mengejutkan) yang disambungkan ke stesen kerja saya masih menjadi editor utama saya (malah ia berfungsi dengan sambungan neovim).
AI Generatif yang dikuasakan oleh LLM dengan pantas mengubah kehidupan kita, tiada gunanya untuk menentangnya. Walau bagaimanapun, IMHO, kita juga harus mempunyai beberapa kekangan diri untuk tidak menggunakannya untuk segala-galanya. Ia benar-benar harus digunakan sebagai pelengkap kepada kerja inovatif atau kreatif, bukan pengganti kepada inovasi dan kreativiti.
Kita juga harus tahu apa yang dihasilkannya, bukannya menerima secara membuta tuli apa yang dilakukannya. Sebagai contoh, dalam genruler, saya membuatnya menambah baik README asal saya dengan contoh yang lebih luas. Daripada menerimanya sebagaimana adanya, saya membuatnya untuk menjana ujian untuk semua contoh yang dijana dalam README, jadi kod contoh itu lulus dan berfungsi seperti yang saya maksudkan.
Secara keseluruhan, ya, saya rasa editor yang dipertingkatkan AI Generatif ini berbaloi dengan wang yang mereka minta. Akhirnya, ini adalah alatan, ia bertujuan untuk menawarkan bantuan untuk bekerja, bukan menggantikan orang yang menekan papan kekunci.
Atas ialah kandungan terperinci Membina perpustakaan mesin negeri dengan bantuan daripada alatan AI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!