تایپ اسکریپت تأثیر قابل توجهی بر اجرای برنامه نویسی شی گرا در جاوااسکریپت داشته است. در این مقاله قصد داریم تا با بررسی چند مثال، با مفهوم برنامه نویسی شی گرا(OOP) در تایپ اسکریپت آشنا شویم.
در ابتدا میخواهیم درمورد این که تایپ اسکریپت چیست صحبت کنیم.
تایپ اسکریپت یک زبان برنامه نویسی با تایپ قوی است که بر اساس جاوااسکریپت ساخته شده است و ابزارهای بهتری را در هر مقیاسی که لازم داشته باشیم به ما ارائه میکند.
این زبان برنامه نویسی در اصطلاح یک superset از جاوااسکریپت به حساب میآید. یعنی میتوانیم اینطور بگوییم که تایپ اسکریپت جاوااسکریپت است، اما جاوااسکریپت تایپ اسکریپت نمیباشد. زیرا تایپ اسکریپت در حال کامپایل شدن به زبان جاوااسکریپت است و جاوااسکریپت به کد ماشین کامپایل میشود.
برای این که تفاوتهای بصری زبان تایپ اسکریپت را در مقایسه با جاوااسکریپت بررسی کنیم، کلاسی به نام Car ایجاد میکنیم. این کلاس را یک بار با جاوااسکریپت و بار دیگر با تایپ اسکریپت مینویسیم.
class Car { model; color; isElectric; constructor(model, color, isElectric) { this.model = model; this.color = color; this.isElectric = isElectric; } drive() { const engineStarted = this.startEngine(); // some method to drive after starting the engine } startEngine() { // some method to start the engine return true; } }
class Car { public model: string; public color: string; public isElectric: boolean; constructor(model: string, color: string, isElectric: boolean) { this.model = model; this.color = color; this.isElectric = isElectric; } public drive(): void { const engineStarted: boolean = this.startEngine(); // some method to drive after starting the engine } private startEngine(): boolean { // some method to start the engine return true; } }
همانطور که میبینیم، این دو کد بسیار شبیه به هم هستند. تنها تفاوتهایی که میتوانیم مشاهده کنیم تفسیر تایپ در قطعه کد تایپ اسکریپت است.
چهار رکن اصلی برای برنامه نویسی شی گرا وجود دارد که عبارتند از:
در ادامه هر یک از این موارد را باهم بررسی میکنیم.
Abstraction اولین رکن برنامه نویسی شی گرا است. به این معنی که فقط باید جزئیاتی که کاربر کلاس لازم دارد را در اختیار آن قرار دهیم. به عبارت دیگر همه اطلاعاتی اساسی که داریم مهم نیستند. ما چندین راه برای رسیدن به انتزاع در تایپ اسکریپت داریم که عبارتند از: کلاس و یا متد انتزاعی، interfaceها و تایپها.
در ادامه مثالی را بر اساس یک کلاس انتزاعی بررسی خواهیم کرد، زیرا در این کلاس میتوانیم خصوصیات و متدهای عمومی را تعریف کنیم که این کار در interfaceها و تایپها ممکن نیست.
abstract class Character { public name: string; public damage: number; public attackSpeed: number; constructor(name: string, damage: number, speed: number) { this.name = name; this.damage = damage; this.attackSpeed = speed; } public abstract damagePerSecond(): number; } class Goblin extends Character { constructor(name: string, damage: number, speed: number) { super(name, damage, speed); } public damagePerSecond(): number { return this.damage * this.attackSpeed; } }
همانطور که میبینیم علاوه بر سازندهای که در آن متغیرها را به ویژگیهای خود اختصاص میدهیم، کلاس انتزاعی ما به نام Character
فقط یک کلاس تعریف است. کلاس Goblin نیز بر این کلاس انتزاعی تکیه میکند.
Encapsulation دومین رکن برنامه نویسی شی گرا میباشد. مفهوم Encapsulation بر اساس ایده پنهان کردن دادهها ساخته شده است. اینجاست که ما دسترسی به ویژگیها یا متدهای خاصی را محدود میکنیم.
در مثالی که داریم ویژگی name_ یک ویژگی private است. این بدان معنی است که ما نمیتوانیم از خارج از کلاس به این ویژگی دسترسی داشته باشیم. برای دسترسی به این ویژگی private، ما از متدهای به اصطلاح getter و setter استفاده میکنیم.
class Character { private _name: string; constructor(name: string) { this._name = name; } public get name(): string { return this._name; } public set name(value: string) { this._name = value; } }
Inheritance یک ویژگی بسیار جذاب است و به ما این امکان را میدهد تا قابلیت استفاده مجدد از کد را داشته باشیم. تصور کنید یک کلاس داریم، و یک کلاس جدید میسازیم که از ویژگیها یا متدهای آن کلاس موجود استفاده میکند. اکنون میخواهیم ویژگیهای جدید را به آن کلاس اضافه کنیم. اینجاست که Inheritance انجام خواهد شد. ما این کلاسها را معمولاً sub-class، child-class و یا lower-class مینامیم. این کلاسها از کلاسهای سطح بالای خود که اغلب به آنها super-class، base-class یا parent-class گفته میشود، extend میشوند.
در مثال زیر، میبینیم که کلاس Orc
با extend شدن از کلاس Character
ویژگیها را ارثبری میکند.
class Character { public name: string; public damage: number; constructor(name: string, damage: number) { this.name = name; this.damage = damage; } public talk(): void { console.log('Says something ...'); } } class Orc extends Character { public weapon: string; constructor(name: string, damage: number, weapon: string) { super(name, damage); this.weapon = weapon; } public attack(): void { console.log(`Attacks his target with his ${this.weapon}.`); } }
Polymorphism توانایی ایجاد یک کلاس با بیش از یک فرم است. یا به عبارت دیگر، کلاسها متدهای یکسان اما پیادهسازیهای متفاوتی دارند.
در مثال پایین یک کلاس parent (Character
) و یک کلاس child (Orc
) داریم. کلاس child در حال بازنویسی ویژگیها و متدهای کلاس parent خود است. این همان چیزی است که Polymorphism نامیده میشود.
class Character { public name: string; public damage: number; constructor(name: string, damage: number) { this.name = name; this.damage = damage; } public talk(): void { console.log('Says something ...'); } public attack(): void { console.log(`Attacks his target with his fists.`); } } class Orc extends Character { public weapon: string; constructor(name: string, damage: number, weapon: string) { super(name, damage); this.weapon = weapon; } public talk(): void { console.log('Says something but in orcish ...'); } public attack(): void { console.log(`Attacks his target with his ${this.weapon}.`); } }
در این مقاله سعی کردیم تا بیشتر با زبان برنامه نویسی تایپ اسکریپت و همچنین برنامه نویسی شی گرا آشنا شویم. همینطور مفهوم شی گرایی در تایپ اسکریپت را باهم بررسی کردیم.