Jika anda merupakan seseorang pengembang odoo, maka anda wajib mengetahui apa itu circular dependency, kenapa bisa terjadi, apa pengaruhnya, dan bagaimana cara mengatasinya. Mari kita bahas
Apa itu Circular Dependency? Kenapa Bisa Terjadi?
Circular dependency merupakan situasi di mana dua atau lebih modul (atau kelas, bean, dll.) saling bergantung secara langsung atau tidak langsung. berikut adalah contoh gambar yang membantu anda untuk memahaminya.
Saya memberi warna merah pada Circular Dependency
dan warna hijau pada Linear Dependency
, sebab Circular Dependency merupakan hal yang buruk untuk digunakan pada environment odoo, karena odoo sendiri membatasi circular dependency.
Contoh Kasus Pertama
- A depends on B
- B depends on C
- C depends on A ✅ circular, meskipun tidak langsung
Contoh Kasus Kedua
Ketika kita membuat module_a
dan kita membuat model model.master
, lalu kita membuat module_b
dan meng-inherit model.master
, namun kita membuat function pada model.master
di module_a
dengan logic yang berisi field yang berada di module_b
. Hal tersebut bisa saja terjadi dan aman ketika kedua module telah kita install. Namun, ini akan menjadi hambatan jika salah satu atau kedua module belum di-install. Hal ini akan menyebabkan error ketika menginstall salah satu module dan membuat module tersebut tidak bisa di-install. Hal ini juga sangat buruk untuk diterapkan pada odoo.
Mengapa Circular Dependency Buruk? Apa akibatnya?
Pada dasarnya, circular dependency tidak didukung oleh odoo, meski itu langsung ataupun tak langsung. Karena hal ini dapat menimbulkan error terutama saat
- Installasi / upgrade module
- Resolusi dependensi di manifest (manifest.py)
- Auto-load model atau field yang saling tergantung sebelum modul siap
contoh-contoh error yang akan muncul
RecursionError: maximum recursion depth exceeded
Module loading failed due to unresolved dependencies: circular reference
Some dependency maybe missing
Bagaimana Cara Menghindari Circular Dependency?
- Pisahkan fungsi yang digunakan bersama ke modul utilitas khusus (misal base_utils)
- Gunakan inheritance (_inherit) daripada depends, jika kamu hanya ingin menambahkan behavior
- Gunakan @api.model atau import dinamis hanya saat dibutuhkan, bukan saat module di-load
- Hindari import antar modul di file level paling atas (import module_x) — pindahkan ke dalam fungsi atau metode untuk lazy loading
- Install ekstensi
Odoo IDE
untuk melihat kepemilikan field pada model