OOP යනු කුමක්ද? එය අවශ්ය වන්නේ ඇයි?
පෙර මොඩියුලයේදී, අපි ක්රමලේඛනයේ මූලික ගොඩනැගුම් කොටස් (variables, loops, functions) පිළිබඳව ඉගෙන ගත්තෙමු. එම ක්රමය, එනම් පියවරෙන් පියවර උපදෙස් ලබා දීමේ ක්රමය "පටිපාටිගත වැඩසටහන්කරණය" (Procedural Programming) ලෙස හැඳින්වේ. කුඩා වැඩසටහන් සඳහා එය ප්රමාණවත් වුවත්, බැංකු පද්ධතියක් හෝ සමාජ මාධ්ය ජාලයක් වැනි විශාල, සංකීර්ණ මෘදුකාංග නිර්මාණය කිරීමේදී එය ඉතා අවුල් සහගත විය හැක.
මෙම අභියෝගයට පිළියමක් ලෙස වස්තු පාදක වැඩසටහන්කරණය (Object-Oriented Programming - OOP) බිහි විය. OOP හිදී, අපි ගැටළුව දෙස බලන්නේ පියවර මාලාවක් ලෙස නොව, එකිනෙක සමග අන්තර්ක්රියා කරන "වස්තූන්" (Objects) එකතුවක් ලෙසයි. සැබෑ ලෝකයේ ඇති ඕනෑම දෙයක් (මිනිසෙකු, මෝටර් රථයක්, බැංකු ගිණුමක්) අපට වස්තුවක් ලෙස සැලකිය හැක. සෑම වස්තුවකටම ඊට අදාළ දත්ත (data/attributes) සහ හැසිරීම් (behaviors/methods) ඇත. OOP මගින් සංකීර්ණ පද්ධති වඩාත් පහසුවෙන් කළමනාකරණය කිරීමට, කේත නැවත භාවිතා කිරීමට (reusability) සහ නඩත්තු කිරීමට පහසු වන පරිදි සංවිධානය කිරීමට ඉඩ සලසයි.
OOP හි මූලික කුළුණු හතර (The Four Pillars of OOP)
1. පන්ති සහ වස්තූන් (Classes and Objects)
මෙය OOP හි මූලිකම සංකල්පයයි.
- පන්තිය (Class): මෙය වස්තුවක් සඳහා වන නිල්-සිතියම (blueprint) වේ. එය වස්තුවක තිබිය යුතු පොදු ගුණාංග (attributes) සහ හැසිරීම් (methods) නිර්වචනය කරයි. උදාහරණයක් ලෙස, "Car" යනු පන්තියකි.
- වස්තුව (Object): මෙය පන්තියක් මත පදනම්ව නිර්මාණය කරන ලද සැබෑ අවස්ථාවකි (instance). උදාහරණයක් ලෙස, ඔබගේ නිවසේ ඇති රතු පැහැති Toyota මෝටර් රථය, "Car" පන්තියෙන් සෑදූ වස්තුවකි. එකම පන්තියකින් වස්තූන් දහස් ගණනක් සෑදිය හැක.
// Java Example
class Car {
String color; // Attribute
int speed; // Attribute
void accelerate() { // Method
// Code to increase speed
}
}
// Creating an object from the class
Car myCar = new Car();
myCar.color = "Red";
2. සංවෘත්තිය (Encapsulation)
මෙය වස්තුවක දත්ත (attributes) සහ එම දත්ත මත ක්රියාත්මක වන ක්රම (methods) එකම ඒකකයක් (එනම්, පන්තියක්) තුළට එකට බැඳ, බාහිර ලෝකයෙන් එම දත්ත සෘජුවම වෙනස් කිරීම වැළැක්වීමයි. මෙය හරියට කැප්සියුලයක් තුළ ඖෂධ අඩංගු කර, එය බාහිර බලපෑම්වලින් ආරක්ෂා කරනවා වැනිය. දත්ත වෙත ප්රවේශ වීමට සහ වෙනස් කිරීමට, අප විසින්ම නිර්මාණය කළ public methods (Getters and Setters) පමණක් භාවිතා කිරීමට ඉඩ දීමෙන්, දත්තවල ආරක්ෂාව සහ නිවැරදි බව තහවුරු කළ හැක.
3. ප්රවේණිය (Inheritance)
මෙය එක් පන්තියකට (child/subclass) තවත් පන්තියක (parent/superclass) ගුණාංග සහ හැසිරීම් උරුම කර ගැනීමට ඇති හැකියාවයි. එමගින්, එකම කේතය නැවත නැවත ලිවීමෙන් වැළකී (code reusability), පන්ති අතර ධූරාවලියක් (hierarchy) ගොඩනැගිය හැක.
උදාහරණය: "Motorcycle" සහ "Truck" යන පන්ති දෙකටම "Vehicle" නමැති මව් පන්තියේ ඇති `speed`, `color` වැනි පොදු ගුණාංග උරුම කරගත හැක. ඔවුන්ට අවශ්ය නම්, තමන්ටම ආවේණික වූ අමතර ගුණාංග (`hasSidecar` හෝ `cargoCapacity`) එකතු කරගත හැක.
4. බහුරූපතාව (Polymorphism)
මෙම වචනයේ තේරුම "බොහෝ ආකාර" (many forms) යන්නයි. OOP හිදී, එකම නම ඇති ක්රමයකට (method) හෝ වස්තුවකට, සන්දර්භය අනුව විවිධ ආකාරයට හැසිරීමට ඇති හැකියාවයි.
උදාහරණය: "Animal" නමැති මව් පන්තියට `makeSound()` නමින් ක්රමයක් තිබිය හැක. නමුත්, "Dog" වස්තුවක් එම ක්රමය ඇමතූ විට "Woof" ලෙස ශබ්ද කරන අතර, "Cat" වස්තුවක් ඇමතූ විට "Meow" ලෙස ශබ්ද කරයි. ක්රමයේ නම එකක් වුවද, එහි ප්රතිඵලය වස්තුව අනුව වෙනස් වේ.
අවසාන වශයෙන්
වස්තු පාදක වැඩසටහන්කරණය යනු හුදෙක් ක්රමලේඛන භාෂාවක feature එකක් නොව, මෘදුකාංග නිර්මාණය කිරීමේදී අප සිතන ආකාරය වෙනස් කරන ප්රබල දර්ශනයකි (paradigm). එය මගින් අපට වඩාත් සංවිධානාත්මක, නම්යශීලී සහ පහසුවෙන් නඩත්තු කළ හැකි මෘදුකාංග ගොඩනැගීමට හැකියාව ලැබේ.
දැන් අපි අපගේ දත්ත සහ ක්රියාවලි, වස්තූන් ලෙස සංවිධානය කරන ආකාරය දන්නා නිසා, ඊළඟට අප ඉගෙන ගත යුත්තේ එම දත්ත විශාල ප්රමාණයක් පරිගණක මතකයේ කාර්යක්ෂමව ගබඩා කර, අවශ්ය විටදී ඉක්මනින් ලබාගන්නේ කෙසේද යන්නයි. ඒ සඳහා, අපි ඊළඟ මොඩියුලයෙන් "දත්ත ව්යුහ සහ ඇල්ගොරිතම" (Data Structures and Algorithms) පිළිබඳව ගැඹුරින් අධ්යයනය කරමු.