Rust Object Oriented Programming
Rust dili de Java, Javascript gibi object-oriented(nesne yönelimli) bir dildir. Bu yönelimi yardımıyla gerçek hayattaki yapının dil içerisinde de kodlanabilmesini sağlamaktadır. Gelin detayına birlikte bakalım.
Öncelikle Object-Oriented Programming(OOP) nedir bir inceleyelim. Temel bileşenleri aşağıdaki gibidir.
- Nesne(object): Nesne, veri ve işlevleri bir arada tutan bir yapıdır. Örneğin, bir arabayı bir nesne olarak düşünebilirsiniz. Araba nesnesinin verileri arabanın markası, modeli, rengi, hızı vb. olabilir. Araba nesnesinin işlevleri ise arabanın hızını artırmak, fren yapmak, viraj almak vb. olabilir.
- Sınıf(class): Sınıf, nesnelerin bir şablonudur. Nesneler, bir sınıftan türetilirler. Örneğin, araba sınıfı, tüm arabaların sahip olacağı verileri ve işlevleri içerir.
- Kalıtım(inheritance): Kalıtım, bir sınıfın diğer bir sınıftan özelliklerini ve işlevlerini miras almasıdır. Örneğin, bir kamyon sınıfı, bir araba sınıfından türetilebilir ve araba sınıfının özelliklerini ve işlevlerini miras alabilir.
- Polimorfizm(polymorphism): Polimorfizm, aynı işlevin farklı şekillerde kullanılabilmesidir. Örneğin, bir hayvan sınıfı içinde farklı hayvan türleri (örneğin, köpekler ve kediler) için farklı sesler çıkaran bir işlev olabilir.
- Soyutlama(abstraction): Soyutlama, detayların gizlenmesidir. Örneğin, bir arabanın içindeki motorun karmaşık yapısının detayları, arabanın kullanıcısı için önemsizdir ve gizlenebilir.
Bu programlama paradigmasının kullanılma şekline aşağıdaki gibi bir örnek verilebilir.
impl AveragedCollection {
pub fn add(&mut self, value: i32) {
self.list.push(value);
self.update_average();
}
pub fn remove(&mut self) -> Option<i32> {
let result = self.list.pop();
match result {
Some(value) => {
self.update_average();
Some(value)
}
None => None,
}
}
pub fn average(&self) -> f64 {
self.average
}
fn update_average(&mut self) {
let total: i32 = self.list.iter().sum();
self.average = total as f64 / self.list.len() as f64;
}
}
Trait kullanımı
Trait’ler, bir veri tipinin sahip olabileceği özellikleri tanımlayan bir yapıdır. Sınıfların yerine geçerler ve nesne yönelimli programlama kavramlarını uygulamak için kullanılır. Bir veya daha fazla fonksiyonun bir liste halinde tanımlandığı bir yapıdır. Bu fonksiyonlar, trait’i uygulayan veri türüne özgü işlemleri gerçekleştirir. Bir trait, veri türleri arasında işlevsel olarak benzer olanları gruplandırmak için kullanılabilir. Aşağıdaki gibi bir kullanıma sahiptir.
pub struct Screen<T: Draw> {
pub components: Vec<T>,
}
impl<T> Screen<T>
where
T: Draw,
{
pub fn run(&self) {
for component in self.components.iter() {
component.draw();
}
}
}