Menguasai Evaluasi Ekspresi
dan Jalan Pohon
dengan Polimorfisme
Dalam dunia pemrograman, memahami evaluasi ekspresi dan kemampuan untuk memanipulasi pohon biner adalah keterampilan penting yang dapat meningkatkan kemampuan pengembangan Anda. Salah satu metode menarik untuk menerapkan konsep ini adalah melalui penggunaan polimorfisme, terutama dalam pemrograman berorientasi objek (OOP).
Posting blog ini akan menjelajahi pertanyaan wawancara klasik yang terinspirasi oleh pengamatan Steve Yegge, di mana kandidat ditantang untuk mengubah ekspresi aritmetika (misalnya, string “2 + (2)”) menjadi pohon ekspresi. Kami akan menjelaskan masalah ini langkah demi langkah, menjelaskan cara memproses pohon-pohon ini menggunakan polimorfisme, dan memberikan wawasan tentang kode.
Masalah: Dari Ekspresi ke Pohon
Memahami Dasar-Dasar
Pada intinya, tugasnya adalah merepresentasikan dan mengevaluasi ekspresi aritmetika sebagai pohon biner:
- Simpul Daun: Ini adalah angka.
- Simpul Internal: Ini adalah operator (misalnya,
+
,-
,*
,/
).
Mengevaluasi ekspresi semacam ini melibatkan “perjalanan” melalui struktur pohon. Jika Anda menghadapi masalah ini, berikut adalah cara untuk memulainya:
- Ubah Ekspresi: Menentukan cara mengubah ekspresi string menjadi struktur pohon.
- Evaluasi Ekspresi: Berjalan melalui pohon untuk menghitung nilai akhir.
Mengapa Menggunakan Polimorfisme?
Banyak kandidat pemrograman sering kesulitan dengan cara terbaik untuk melaksanakan tugas-tugas ini. Metode yang paling sederhana, seperti menggunakan pernyataan switch atau struktur if-else bersarang, dapat menjadi tidak teratur dan sulit untuk dikelola.
Polimorfisme memungkinkan Anda untuk mendefinisikan antarmuka umum untuk sekelompok kelas terkait, yang mengarah pada desain yang lebih fleksibel dan dapat dikelola. Ketika menghadapi operasi yang berbeda, polimorfisme memungkinkan Anda untuk memanggil metode yang benar tanpa perlu mengetahui rincian implementasi operasi tersebut.
Solusi: Menerapkan Pohon Polimorfik di Python
Mari kita selami kode untuk lebih memahami bagaimana polimorfisme beroperasi dalam konteks ini.
Penjelasan Kode
#!/usr/bin/python
class Node:
"""Kelas dasar, Anda seharusnya tidak memproses salah satu dari ini."""
def process(self):
raise('Anda seharusnya tidak memproses sebuah node') # Abstrak
class BinaryNode(Node):
"""Kelas dasar untuk simpul biner."""
def __init__(self, _left, _right):
self.left = _left
self.right = _right
def process(self):
raise('Anda seharusnya tidak memproses sebuah binarynode') # Abstrak
class Plus(BinaryNode):
def process(self):
return self.left.process() + self.right.process()
class Minus(BinaryNode):
def process(self):
return self.left.process() - self.right.process()
class Mul(BinaryNode):
def process(self):
return self.left.process() * self.right.process()
class Div(BinaryNode):
def process(self):
return self.left.process() / self.right.process()
class Num(Node):
def __init__(self, _value):
self.value = _value
def process(self):
return self.value
# Kasus pengujian untuk demonstrasi
def demo(n):
print(n.process())
demo(Num(2)) # Output: 2
demo(Plus(Num(2), Num(5))) # Output: 7 (2 + 5)
demo(Plus(Mul(Num(2), Num(3)), Div(Num(10), Num(5)))) # Output: 8 ((2 * 3) + (10 / 5))
Rincian Kode
-
Kelas Dasar Abstrak:
Node
- Ini berfungsi sebagai kelas dasar untuk semua node.
- Metode
process()
dirancang untuk di-override tetapi tidak secara langsung dieksekusi padaNode
.
-
Kelas Dasar Abstrak:
BinaryNode
- Mewarisi dari
Node
dan mewakili operator biner. - Berisi node anak untuk sub-ekspresi kiri dan kanan.
- Mewarisi dari
-
Kelas Konkret untuk Operasi
- Kelas
Plus
,Minus
,Mul
, danDiv
mewarisi dariBinaryNode
dan mengimplementasikan metodeprocess()
untuk mengevaluasi ekspresi.
- Kelas
-
Kelas Simpul Daun:
Num
- Mewakili nilai numerik dan mengembalikan nilai yang disimpan saat
process()
dipanggil.
- Mewakili nilai numerik dan mengembalikan nilai yang disimpan saat
Pemikiran Akhir
Polimorfisme menawarkan cara yang kuat untuk menerapkan evaluasi ekspresi dalam pemrograman. Dengan mematuhi struktur ini, pengembang dapat membuat kode yang jelas, terorganisir, dan fleksibel yang memungkinkan penambahan dan modifikasi yang mudah.
Sebagai kesimpulan, menguasai transformasi dari string ekspresi aritmetika ke pohon ekspresi menggunakan polimorfisme membuka banyak kemungkinan. Pola desain ini tidak hanya menyederhanakan proses pengkodean tetapi juga meningkatkan pemeliharaan kode Anda.
Sekarang setelah Anda memahami konsepnya, cobalah menerapkan variasi Anda sendiri dan jelajahi dunia pemrograman yang luas!