Nesne Yönelimli Programlamanın üçüncü temel prensibi olan abstraction, yani soyutlama konusuna bakacağız. Öncekilerde olduğu gibi gerçek hayat ve kod örnekleri ile anlatmaya çalışacağım.

3-Abstraction

Bu prensibin temel amacı karmaşık üyeleri izole bir şekilde ayrıştırarak nasıl çalıştıklarından bağımsız kullanılır olmalarını sağlamaktır. Arabanızı kullanabilmeniz için motorunun tüm özelliklerini ya da vitesin şanzımandaki mekanik hareketlerini bilmek zorunda değilsiniz. Ama sonuçta o motorun tasarımını, geliştirmesini ve testlerini birileri yaparak en iyi verimle seri üretime geçmiştir. Her markanın böyle düzgün çalışmadığını ben de biliyorum ama ana fikri kaçırmayalım, kuvvet - hareket - ivme - momentum - iş gibi kavramları bilmeden de aracı kullanırsınız. Debriyaj diye bildiğimiz bir pedalla baskı ve volanı ayırıp vites diye bildiğimiz uyduruk bir kolla altımızdaki bir sürü dişliyi kontrol eder, bunu tasarlayan adamlar dururken "Ne kadar hızlı vites değiştiriyorum" falan diye bir de bunun havasını atarız.🤭

Şu an bu yazıyı okuduğunuz ekran; bir bilgisayar, telefon, tv her neyse onu çalıştıran iç yapısı sizi ilgilendirmemeli ki siz bunları dert etmeden kullanabilesiniz. Hız, performans benzeri kriterlerden bahsetmiyorum o zaman ilgilendirebilir, ama sadece ilgilendirir, inceler ona göre bir marka, model falan seçersiniz. Oturup evde bir işlemci ya da ne bileyim bir SSD disk imal edeyim gibi tuhaf bir istek içine girmezsiniz.

Bunlar gerçek hayattan rastgele bulduğum küçük örnekler. Normalde bunlar bir sürü kontrolün yapıldığı çok daha karmaşık operasyonlar tabi ama en basitleştirilmiş kod örnekleri aşağıda.

Modellemeler olası en sade ve basit şekilde tutulmuştur.


namespace GurkanTuna.Abstraction {
    abstract class VehicleBase {

        protected VehicleBase(int horsePower, int? maxGear) {
            HorsePower = horsePower;
            MaxGear = maxGear ?? 5;
        }

        public int MaxGear;
        public abstract int Gear { get; set; }
        public int HorsePower { get; }
        public int Speed { get; set; }

        public virtual int GearUp() {
            if (Gear != MaxGear) {
                ++Gear;
            }
            return Gear;
        }

        public virtual int GearDown() {
            if (Gear > 0) {
                --Gear;
            }
            return Gear;
        }

    }

    class Vehicle : VehicleBase {

        public Vehicle(int horsePower, int? maxGear) : base(horsePower, maxGear) { }

        private int _gear;
        public override int Gear {
            get => _gear;
            set {
                if (HorsePower < 180) {
                    if (Speed >= 0 && Speed <= 40) {
                        _gear = 1;
                    }
                    else if (Speed > 40 && Speed <= 70) {
                        _gear = 2;
                    }
                    else if (Speed > 70 && Speed <= 80) {
                        _gear = 3;
                    }
                    else if (Speed > 80 && Speed <= 100) {
                        _gear = 4;
                    }
                    else {
                        _gear = MaxGear;
                    }
                }
                else {
                    if (Speed >= 0 && Speed <= 80) {
                        _gear = 1;
                    }
                    else if (Speed > 80 && Speed <= 120) {
                        _gear = 2;
                    }
                    else if (Speed > 120 && Speed <= 180) {
                        _gear = 3;
                    }
                    else if (Speed > 180 && Speed <= 220) {
                        _gear = 4;
                    }
                    else {
                        _gear = MaxGear;
                    }
                }
            }
        }
    }

    class Car : Vehicle {
        public Car(int horsePower, int? maxGear = 6) : base(horsePower, maxGear) {
            if (horsePower < 30) {
                throw new ApplicationException("Cannot be sent below 30 hp");
            }

            if (maxGear < 2) {
                throw new ApplicationException("Cannot be sent below 2 gear");
            }
        }
    }

    class UI {
        static void Main() {
            var car = new Car(100, 5) {
                Speed = 180,
                Gear = 3//180 km/sa ile 3.vitese atmamıza rağmen araç 5.vitese geçer
            };

            var car2 = new Car(250) {
                Speed = 180,
                Gear = 3//180 km/sa ile 3.vitese sorunsuz geçer
            };
        }
    }
}

Nesne Yönelimli Programlama (OOP) Temel Prensipleri 1 - EncapsulationNesne Yönelimli Programlama (OOP) Temel Prensipleri 2 - InheritanceNesne Yönelimli Programlama (OOP) Temel Prensipleri 4 - Polymorphism