کداکسپلور | CodeExplore
7.91K subscribers
1.92K photos
297 videos
103 files
1.68K links
با کد اکسپلور یاد بگیر، لذت ببر و بروز باش ⚡️😉

سایت کد‌اکسپلور:
CodeExplore.ir
👨🏻‍💻 ارتباط با ما :
@CodeExploreSup
گروه :
@CodeExplore_Gap
تبلیغات در کد اکسپلور :
@CodeExploreAds
Download Telegram
🔹آشنایی با مفهوم Public و Private و Protected در شی گرایی


در برنامه‌نویسی شی‌گرا، این کلیدواژه‌ها (Public، Private، Protected) برای تعریف دسترسی به اعضای یک کلاس استفاده می‌شوند. این‌ها به توسعه‌دهندگان کمک می‌کنند تا سطح دسترسی یک Property یا Method را مشخص کنند.

- Public
پراپرتی یا متدی که با کلمه کلیدی public تعریف می‌شود، در هر جای برنامه قابل دسترسی است. به این معنی که می‌توان به آن از خارج از کلاس (Global)، داخل خود کلاس و از کلاس‌های دیگر دسترسی داشت. این نوع دسترسی برای ارتباط عمومی بین اعضای یک کلاس با سایر اجزای برنامه استفاده می‌شود.

- Protected
عضوی که با کلمه کلیدی protected تعریف می‌شود، به این معنی است که هم از درون خود کلاس و نیز از طریق کلاس‌هایی که از آن ارث‌بری شده‌اند می‌توان به آن‌ها دسترسی داشت. اما از خارج از کلاس یا کلاس‌های دیگری که از این کلاس ارث‌بری نکرده‌اند نمی‌توان به اعضای protected دسترسی پیدا کرد. این نوع دسترسی معمولاً برای ساختن روابط بین کلاسی استفاده می‌شود.

- Private
پراپرتی یا متدی که با کلمه کلیدی private تعریف می‌شود، تنها درون کلاس خود کلاس قابل دسترسی است و از خارج از کلاس یا سایر کلاس‌های ارث‌بری شده نیز قابل دسترسی نیستند. دسترسی private معمولاً برای نگهداری جزئیات پنهان یا اطلاعات خصوصی کلاس استفاده می‌شود و اجازه دسترسی مستقیم به آن‌ها از خارج کلاس محدود می‌شود.

#oop
@CodeExplore
🔥144❤‍🔥1
🔹برنامه‌نویسی شی‌گرا Object-Oriented Programming - OOP چیست؟

در برنامه‌نویسی شی‌گرا، کد به شی‌ها (objects) و کلاس‌ها (classes) تقسیم می‌شود. هر شیء در OOP دارای وضعیت (متغیرها) و رفتار (متدها) است. این به ما این امکان را می‌دهد که موضوعات را به صورت واقعیت‌محور (object-centric) شرح دهیم، بجای اینکه به شیوه ساختارمحور (procedural) عمل کنیم.

تصور کنید یک برنامه مدیریت کتابخانه دارید. در برنامه‌نویسی شی‌گرا، شما می‌توانید یک کلاس "کتاب" ایجاد کنید که ویژگی‌هایی مانند عنوان، نویسنده، و شماره شابک را دارد. سپس شما می‌توانید از این کلاس برای ایجاد اشیاء مختلفی مانند "کتاب" یا "رمان گذر" استفاده کنید.

class Book:
def init(self, title, author, ISBN):
self.title = title
self.author = author
self.ISBN = ISBN

def display_info(self):
print(f"Title: {self.title}, Author: {self.author}, ISBN: {self.ISBN}")

first_book = Book("The Catcher in the Rye", "J.D. Salinger", "9780316769488")
second_book = Book("To Kill a Mockingbird", "Harper Lee", "0061120081")

first_book.display_info()
second_book.display_info()

🔸 برنامه‌نویسی رویه‌ای Procedural Programming چیست؟

در برنامه‌نویسی رویه‌ای، برنامه به صورت مجموعه‌ای از رویه‌ها یا توالی‌های دستورات سازماندهی می‌شود. تمرکز اصلی بر روی دستورات و توالی اجرا قرار دارد، و مفاهیمی مانند تقسیم مسئله به اجزای کوچک‌تر یا تجزیه و تحلیل (decomposition) از اهمیت زیادی برخوردارند.

اگر در برنامه‌نویسی رویه‌ای بخواهید یک برنامه برای محاسبه میانگین اعداد در یک لیست بنویسید، ممکن است شما یک توالی از دستورات برای جمع زدن اعداد لیست و سپس تقسیم بر تعداد اعضا را بنویسید.

def calculate_average(num_list):
total = sum(num_list)
count = len(num_list)
average = total / count
return average

my_list = [3, 5, 7, 11, 13, 17]
result = calculate_average(my_list)
print(f"The average is: {result}")

#oop #procedural
@CodeExplore
10🔥4❤‍🔥1
🔺تفاوت برنامه نویسی شی گرا و برنامه نویسی رویه ای

1. منطق و ساختار:
- OOP: تمرکز بر روی اشیاء و آنچه که انجام می‌دهند و ویژگی‌هایشان دارد.
- Procedural: تمرکز بر روی دستورات و توالی اجرا.

2. تجزیه و تحلیل مسئله:
- OOP: به کمک مفاهیم چیدمانی شیء می‌توان به ساختار منظمی دست یافت.
- Procedural: با تقسیم مسئله به اجزای کوچک‌تر و توالی اجرا آنها به رسیدگی می‌شود.

3. سطح انتزاع (Abstraction):
- OOP: قابلیت انتزاع بالا با استفاده از کلاس‌ها و اشیاء.
- Procedural: سطح کمتری از انتزاع وجود دارد.

4. باز استفاده کد (Code Reusability):
- OOP: کد قابل استفاده مجددی را بوجود می‌آورد.
- Procedural: کد تکراری‌تر است و بازاستفاده کمتری دارد.

5. تعمیم (Generalization) و وابستگی (Dependency):
- OOP: می‌توان کلاس‌ها را به یکدیگر مرتبط کرد و ارث‌بری و پلیمرفیسم را پشتیبانی می‌کند.
- Procedural: این قابلیت‌ها کمتر مورد پشتیبانی قرار می‌گیرند.

در نهایت، انتخاب بین این دو رویکرد به میزان پیچیدگی پروژه، ساختار و توسعه پذیری برنامه و البته تجربه و توانایی برنامه‌نویس بستگی دارد.

اگر تفاوت دیگه توی ذهنتون هست توی کامنت ها بنویسید🧡

#oop #procedural
@CodeExplore
11🔥5❤‍🔥1
👋خوش آومدین به اولین قسمت از آموزش OOP و قراره توی این سری آموزشیمون، قواعد، فواید و ویژگی های OOP رو بشناسیم و باهاش کار کنیم

◀️تعریف OOP : برنامه نویسی شیءگرا یک روش برنامه نویسیه که برنامه رو بر اساس داده ها یا شیء(Object) ها به جای عملکرد ها و منطق سازماندهی میکند، یک شیء میتونه به عنوان یه فیلد داده تعریف بشه که ویژگی ها و رفتار های منحصر به فرد خودشو داره.

1️⃣گام اول OOP جمع آوری تمام شیءهایی هست که برنامه نویس میخاد ازشون استفاده کنه و دستکاریشون کنه، شما باید بدونین این شیء ها چطوری کار میکنن و چطور به هم دیگه مرتبط هستن

ساختار برنامه نویسی شیء گرا (OOP):
🔴-کلاس ها ( Classes ) :کلاس ها انواع داده تعریف شده توسط کاربر هستن که به عنوان یه طرح کلی برای ساخت شیء ها عمل میکنن.
🔴-شیء ها ( Objects ) : نمونه هایی ( instance ) از کلاس ها هستن که با داده هایی که به طور خاص تعریف شده‌اند ایجاد میشن،.
🔴-متود ها ( Methods ) : فانکشن هایی هستن که داخل کلاس تعریف میشن و رفتار های یک شیء رو توصیف میکنن،
🔴-ویژگی ها ( Attributes ) : ویژگی ها در الگوی کلاس ها تعریف میشن و وضعیت یک شیء رو نشون میدن، ویژگی های کلاس متعلق به خود کلاس هتسن

اصول اصلی OOP :
🔴-پوشش ( Encapsulation ) : این اصل میگه که تمام اطلاعات مهم در داخل یک شیء قرار داره و فقط اطلاعات انتخابی فاش میشه، پیاده سازی وضعیف هر شیء به طور خصوصی داخل کلاس تعریف شده و نگهداری میشه
🔴-تجرید ( Abstraction ) : شیءها فقط مکانیزم های داخلی را که برای استفاده از شیءهای دیگه مربوط هست رو فاش میکنن، و هر کد اجرایی غیر ضروری رو مخفی میکنن.
🔴-ارث بری ( Inheritance ) : کلاس ها میتونن کد رو از کلاس های دیگه استفاده مجدد کنن، روابت و زیرکلاس ها بین شیءها میتونن اختصاص داده بشن
🔴-چندریختی ( Polymorphism ) : شیءها طراحی شدن تا رفتار هارو به اشتراک بزارن و میتونن چندین شکل به خودشون بگیرن

#oop #oop_1
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤‍🔥54
زبان های خالص محبوب برای OOP :
Ruby , Scala , JADE , Emerald
این زبان ها عمدتا برای OOP طراحی شدن:
Java , Python , C++
زبان هایی که با OOP جفت میشن:
Visual Basic .NET , PHP , JavaScript

💎ویژگی های OOP :
-ماژولار ( Modularity ) : پوشش باعث میشه که شی ها خود کفا بشن و دیباگ و عیب یابی و توسعه همکاری خیلی آسون تر بشه
-قابلیت استفاده مجدد کد ( Reusability ) : کد ها میتونن از طریق ارث بری دوباره استفاده بشن، به این معنی که تیم شما دیگه نیاز نیست یه کد رو چند بار بنویسه.
-بهره وری ( Productivity ) : برنامه نویسا میتونن برنامه های جدید رو سریع تر با استفاده از کتابخونه های متعدد و قابل استفاده مجدد بسازن
-مقیاس پذیر و قابل ارتقا ( Easily upgradable and scalable ) : برنامه نویسا میتونن عملکرد های سیستم برنامه رو به طور مستقل پیاده سازی کنن
-توصیفات رابط ( Interface descriptions ) : سیستم های خارجی ساده هستن و به همین دلیل تکنلیک های ارسال پیام که برای ارتباط شیء ها استفاده میشن.
-امنیت ( Security ) : با استفاده از پوشش و تجرید ، کد پیچیده مخفی میشه و نگهداری نرم افزار آسان تر میشه و علاوه بر اون، پروتکل های اینترنت محافظت میشن.
-انعطاف پذیری ( Flexibility ) : چند ریختی اجازه اینو میده که یک تابع واحد به کلاس که داخل اون قرار داره تنظیم بشه و شیء های مختلف هم از طریق یک رابط یکسان رد بشن.

#oop #oop_2
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥6❤‍🔥3
🔥برگشتیم با ادامه مباحث OOP و امروز قراره درباره مفاهیم و مباحث OOP بیشتر صحبت کنیم و موارد داخلش رو بیشتر بررسی کنیم

👑خب ما داخل جلسه قبل درباره OOP توضیح دادیم و گفتیم شامل یسری مواردی میشه که یه توضیح کوتاهی هم دادیم حالا اومدیم که توضیحات بیشتری با مثال برای درک بهتر ارائه بدیم

◀️کلاس ها ( Classes ) : گفتیم که کلاس ها توی برنامه نویسی شیءگرا یه قالب و طرح کلی هستن که برای ساختن شیء ها به کار میرن، یه کلاس هم شامل داده ها و متغیر ها و توابعیه که باهاشون کار میکنه.
برای مثال میتونیم یه کلاس Car داشته باشیم که این موارد رو داخل خودش داره:
متغیر یا پراپرتی های color , model , year برای ویژگی های ماشین و توابع زیر ( البته گفتیم تابعی که داخل ابجکت باشه بهش میگن متود)
start() , stop() , accelerate()


حالا ما اگر بخایم داخل javascript این کلاس رو بسازیم کدش به شکل زیر میشه:

class Car{
constructor(color , model , year){
this.color = color;
this.model = model;
this.year = year;
}

start() {
//Codes
}

stop() {
//Codes
}

accelerate() {
//Codes
}

logColor(){
console.log(this.color);
}
}


خب این کد های ما الان دارن یه کلاس رو نشون میدن که یه constructor یا همون سازنده داره و یسری ورودی هارو دریافت میکنه و اونارو به ویژگی های شیء نسبت میده، و یسری متود هم داریم که فعلا داخلشون کدی نزدیم ولی یه تابع logColor داریم که برامون رنگ ماشین رو چاپ میکنه ( دقت کنین دوستان دیگه اینجا کلمه کلیدی this اشاره به همون ابجکتمون داره)

◀️شیءها ( Objects ) : شیء ها همون نمونه هایی هستن که از کلاس ها میسازیم، ما الان وقتی که کلاس Car رو ساختیم میتونیم شیء های مختلف و زیادی رو از روش بسازیم

برای ساخت شیء از روی کلاس ها توی javascript این کار رو میکنیم:
const myCar = new Car("red" , "206" , 2023);


الان اینجا ما یه متغیر ( البته چون const به کار رفته ثابت هست ) ساختیم و این ثابت با اسم myCar یه اینستنس هست از کلاس Car و ورودی هایی که داخل constructor مشخص کرده بودیم رو براش فرستادیم

حالا بیاین ببینیم داره چه اتفاقی میوفته
myCar.logColor();
console.log(myCar);
const anotherCar = new Car("blue" , "234" , 2021)
console.log(anotherCar);
anotherCar.logColor()


🔵ما اینجا اول اومدیم ثابت myCar رو از متود logCar خودش استفاده کردیم تا رنگش رو لاگ بگیره، و بعدش هم خودمون کل ابجکت رو لاگ گرفتیم، یه ثابت دیگه به اسم anotherCar ساختیم و اونو هم لاگ گرفتیم، میبینیم که با اینکه کلاس های هردو یکی هست و هردو یه متود logColor دارن ولی خروجی ها متفاوته

💎دوستان لطفا توی هر زبان برنامه نویسی که کار میکنین سعی کنین این شیءگرایی و مثال هارو ببرین جلو و خودتون بررسیش کنین

#oop #oop_3
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
8❤‍🔥4🔥4
سلام به همه دوستان کد اکسپلوری ✌️
قراره امروز در رابطه با underscore در پایتون صحبت کنیم.(که واقعا احتمال میدم طولانی بشه )
شاید underscore برای تازه کارا یکم جدید باشه ولی زیاد به اسمش کار نداشته باشید چون همون آندرلاین خودمونه (_)

بخوام خیلی جامع توضیح بدم کلا ۵ حالت داریم که از underscore توی پایتون استفاده میکنیم.

1️⃣ اولین حالت بصورت استفاده خالی ازشه ، بزارید یه مثال ریز بزنم :
_ = 'hello'
# Or
for _ in range(1, 10):
print(_)

اگه جایی همچین چیزی دیدید ، اولین موردی که باید بدونید ، اینه که خود پایتون همیشه اخرین مقداری که به مفسر میدید رو داخل _ میریزه (به عنوان last variable) و دومین چیزی که باید بدونید اینه که برنامه نویسی که از underscore خالی استفاده میکنه، دنبال یه متغیر موقت میگرده و جای دیگه ایی ازش استفاده نمیکنه (مثلا داخل حلقه خیلی استفادش منطقیه 🙄)

کلا زمانی از underscore خالی استفاده میکنیم که واقعا نیازی به متغیر در جاهای دیگه نداریم و کلا فقط همونجا بکارمون میاد‌ 🫠

حالت دوم تا پنجم استفاده از underscore در واقع میشه گفت به جایگشته !
یعنی یا قبل از اسم میاد یا بعدش یا از هر دو طرفش یا یدونه میاد یا دوتا
احتمالا گیج شدید ☹️

ولی الان مثال میزنم که درک کنیم.

2️⃣حالت دوم زمانیه که شما از یدونه underscore قبل از اسم یا متود استفاده میکنید . مثل زیر :
_name = 'xxx'
def _fun():
print(1)

خب حالا اصلا این اسم گذاری چیکار میکنه؟
اگه زبان دیگه ایی مثل جاوا یا php کار کرده باشید میدونید که اعضا داخل کلاس ها Access Modifiers دارن (خیلی ساده بخوام بهش اشاره کنم ، یعنی تعریف میکنه این متغیر از کجا بهش دسترسی داریم و کجا نداریم)
اگرم فقط پایتون کار کردید میدونید که پایتون اکسس مکسس نمیشناسه 🫡
و نمیتونید براش public , private و ... تعریف کنید . حالا اینارو برای چی گفتم؟ که برسم به underscope قبل از اسم؛ دقیقا یدونه اندرلاین قبل از اسم تابع یا متغیر باعث میشه که ما اون متغیر یا تابع رو private ببینیم و بدونیم که خارج از این کلاس استفاده نمیشه (البته توجه کنید که پایتون اصلا پیگیر اینا نیست! یعنی شما _ هم بزارید و import کنید بازم میتونید به اون متغیر دسترسی داشته باشید! این نوع نام گذاری بیشتر برای مشخص کردن برای خودتون و اعضا تیمه وگرنه خود پایتون کلا اهمیتی بهش نمیده! 😕)
البته نه که کلا اهمیت نده! زیر یه مثال میزنم تا اهمیتشو ببنیم :
Class C1:
name = 'amir'
_age = 21

فایل بالا رو ایمپورت میکنیم :
Class C2:
from C1 import name, _age

# کد بالا خیلی راحت بدون ارور اجرا میشه


# # # # #


import C1
C1._age

# بازم کد بالا بدون ارور اجرا میشه


# # # # #


from C1 import *
print(_age)

# ایندفعه به ارور میخوریم! پایتون فقط در زمانی آندراسکوپ رو ایمپورت نمیکنه که شما ستاره بزارید، در غیر اینصورت خیلی معمولی رفتار میکنه!!!!

حالت سومو من خودم خیلی دوست دارم😄

3️⃣ حالت سوم شما underscore رو بعد از اسم قرار میدید (ولی نه هر اسمی!) یعنی میشه گفت یجور تریک حساب میشه. مثلا شما میخواید یه متغیر تعریف کنید به اسم class ولی class خودش یه کلمه کلیدیه (شاید بگید خب اسمشو عوض میکنیم! اما یه وقتایی دقیقا اون متغیر نیاز به همچین اسمی داره ) اینجاست که به عنوان برنامه نویس underscore رو به ته اسم اضافه میکنیم :
class = 'class one'
# error bteaking
class_ = 'class two'
# without error

#پست_پیشنهادی
#part1
#python #underscore #variable #oop
☕️ @CodeExplore
12🔥10❤‍🔥4
خب ادامه حالت هارو هم بگم تا نصفه ولش نکنیم 😀
خب حالت چهارم یکمی از سادگی خارج میشه و وارد بحث شی گرایی میشه! از الان بگم !

4️⃣ حالت چهارم شما دوتا underscope قبل اسم میزاری (که بهش میگن double underscope یا بین برنامه نویسا جا افتاده dunder) یعنی متغیر name__ رو میخونیم داندر نِیم

حالا جدا از اسمش ، این یکی دقیقا چیکار میکنه برامون؟ اینو کلا باید با مثال برم جلو 🤓

فرض کنید ما دوتا کلاس داریم که یکی از کلاس ها از اون یکی ارث بری میکنه :
class Human():
def __init__(self):
self.sex = 'male'
self.name = 'karim'

class Teacher(Human):
sef __init__(self):
super().__init__()
self.count = 2
self.name = 'math'

اگه به کلاس های بالا نگا کنید توی جفتشون یه فیلد name داریم ، و چون کلاس teacher از human ارث بری میکنه و داخل خودش صداش میزنه دوتا فیلد name باهم قاطی میشن 🥲
اونوقت ما چجوری میتونیم به جفتشون دسترسی داشته باشیم؟

اینجاست که dunder میاد وسط و مثال بالا رو تغییر میدیم:
class Human():
def __init__(self):
self.sex = 'male'
self.__name = 'karim'

class Teacher(Human):
sef __init__(self):
super().__init__()
self.count = 2
self.__name = 'math'

شاید بگید خب الانم که اسماشون باز شبیه همه، ولی داندر داره! اینجاست که پایتون میگه من دخالت میکنم و اسامی که به صورت dunder دار نوشته شدن رو تغییر میدم😎
بیاید یه شی بسازیم و ببنیم توش چیه :
t1 = Teacher()
dir(t1)
# ['_Human__name', '_Teacher__name', 'sex', 'count']

میبیند که با اضافه کردن dunder پایتون کلا اسم پراپرتی رو عوض کرد و اسم کلاس رو اولش چسبوند. اینجوری خیلی راحت از هم تفکیک میشن😁

5️⃣ و آخرین حالتم زمانیه که شما یه dunder اول اسم میزارید و یدونه هم اخر اسم
که میشه مثل ‌_‌_init_‌_ که بهش میگن magic method و خود مفسر پایتون کاری به این نوع اسم گذاریتون نداره و فقط برای خوانایی کده! یعنی خودتون تصمیم میگیرد فلان تابع رو اینجوری تعریف کنید برای فلان کار (یعنی برای یه کار خاص رزروش کنید و بدونید خارج از اونجا هم کاری باهاش ندارید و فقط برای یه کاره)

مثلا همین _‌_init_‌_ رو وقتی داخل یه کلاس صدا میزنید یعنی تابع سازنده رو صدا زدید و میدونید که این تابع هم خارج از خود کلاس به کار نمیاد و فقط رزرو شده برای سازنده بودن!


در اخرم باید بگم برای سنیور شدن حتما این چیزا رو رعایت کنید. هم برای درک خودتون خوبه هم برای بقیه برنامه نویسایی که کدتونو نگا میکنن

دیگه کوتاه تر از این نمیتونستم بکنم.
روز خوبی داشته باشید💓

#پست_پیشنهادی
#part2
#python #underscope #oop
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
13❤‍🔥9🔥6
🔥برگشتیم با یه اموزش دیگه از اموزش های OOP

امروز قراره به ادامه مباحث OOP و ساختار کلاس ها و ویژگی های اون بپردازیم

داخل آموزش قبلی یسری مثال هایی زدیم و بیشتر تمرکزمون روی کلاس و آبجکت بود، امروز قراره درباره 4 مفهوم دیگه صحبت کنیم:

🔵متود ها ( Methods ) : همونطور که قبلا گفتیم، متود ها همون فانکشن هایی هستن که داخل یه آبجکت وجود دارن، این فانکشن ها میتونن روی ویژگی های آبجکت تاثیراتی بزارن و با اونا کار کنن

🔵پراپرتی ها ( Properties ) : همون ویژگی ها و متغیر هایی هستن که به آبجکت تعلق دارن و میتونن هر نوعی از داده رو نگه دارن

🔵سازنده ( Constructor ) : سازنده یه متود خاصه که داخل کلاس وجود فراخوانی میشه، این متد معمولا برای مقدار دهی آبجکت جدید به کار میره و یسری ورودی میتونه بگیره که نسبتشون بده به آبجکت

🔵مخرب ( Destructor ) : مخرب هم یه متود خاص دیگه داخل کلاس هست که وقتی یک آبجکت دیگه نیاز نباشه فراخونی میشه و حذفش میکنه، این متود معمولا برای پاکسازی به کار میره تا حافظه رو خالی کنی یا اتصالات رو ببندی و داخل php و ++C استفاده میشه، توی Python و Java هم وجود دارن اما تو یسری زبان های دیگه به صورت خودکار و شکل های مختلف وجود دارن، مثلا داخل JavaScript میتونیم از کلمه کلیدی delete استفاده کنیم تا پراپرتی های یک آبجکت رو حذف کنیم یا حتی خود متغیر و ابجکتمون رو خالی کنیم

بریم یه مثال قشنگ هم باهم ببینیم:

class Person{
constructor(personName , personAge){
this.name = personName;
this.age = personAge;
}

walk(){
console.log(`${this.name} started walking`);
}
}

let person = new Person("Reza" , 50);

person.walk();

console.log(person);
delete person.age;
console.log(person);
let person = null;


📌خب توی مثال بالا ما یه کلاس Person داریم و سازنده کلاسمون میشه همون constructor که توی ورودی، اسم و سن شخص رو میگیره، داخل متود سازنده، ما property های آبجکت رو میسازیم و مقدار های ورودی رو بهشون نسبت میدیم حتی میشه یه مقدار دیفالت خودمون بزاریم و از ورودی نگیریم!
متود walk هم میاد یه جمله چاپ میکنه

⭐️حالا ما یه متغیر person ساختیم و این یه اینستنس یا نمونه از کلاس Person هست و ورودی هایی که توی constructor توضیح دادیم رو اینجا بهش پاس میدیم و آبجکتمون ساخته میشه
بعدش از متود walk استفاه کردیم

💎داخل خط های اخر هم مفهوم Destructor رو توی جاوا اسکریپت پیاده کردیم، اومدیم اول پراپرتی age رو ازش حذف کردیم، بعدشم کل متغیر رو خالی کردیم

#oop #oop_4
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
7❤‍🔥4🔥4
💥خوش اومدین به یکی دیگه از آموزش های OOP

امروز قراره به مبحث Encapsulation یا همون پوشش یا پوشاندن توی شیءگرایی بپردازیم

حالا Encapsulation چیه؟
-در اصل Encapsulation یعنی محدود کردن دسترسی به برخی از اجزای یک شیء، این کارو میتونیم با قرار دادن یسری داده ها و متد ها داخل کلاس انجام بدیم

☄️چرا باید از Encapsulation استفاده کنیم؟
-موقع استفاده از Encapsulation ، این اجازه به ما داده میشه که جزئیات رو از کاربران مخفی کنیم و فقط رابط کاربری رو نشون بدیم. اینطوری هم کدمون ساده تر و قابل فهم تره هم امنیت بیشتری داره و قابل نگهداری تره.

‼️استفاده از Getter و Setter در OOP ( برنامه نویسی شیءگرا ) : داخل OOP ما معمولا از getter و setter استفاده میکنیم تا دسترسی به ویژگی های یه شیء رو مدیریت و کنترل کنیم، این متد ها به ما این اجازه رو میدن که یسری عملیات خاص و کنترل شده رو هنگام دریافت یا تنظیم مقدار یه متغیر انجام بدیم

🔴حالا یه مثال میزنیم از getter و setter داخل OOP

class Car {
constructor(model) {
this._model = model;
}

get model() {
return this._model;
}

set model(value) {
if (value.length < 3) {
console.log('Model is too short.');
return;
}
this._model = value;
}
}

let myCar = new Car("Toyota");
console.log(myCar.model); // Outputs: "Toyota"

myCar.model = "VW";
console.log(myCar.model); // Outputs: "VW"

myCar.model = "X"; // Outputs: "Model is too short."


#oop #oop_5
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
8❤‍🔥5🔥5
⚡️اومدیم با یه آموزش دیگه از سری آموزشی OOP

📣امروز قراره راجب مبحث ارث بری ( Inheritance ) در OOP صحبت کنیم.

📌ارث بری ( Inheritance ) چیست؟؟
-ارث بری یعنی اینکه ما ویژگی ها و رفتار های یک کلاس رو به کلاس دیگه انتقال بدیم، یعنی یه کلاس داشته باشیم که ویژگی هاشو از یه کلاس دیگه به ارث برده و استفاده میکنه

⭐️کلاس های پایه و زیرکلاس ها:
-وقتی ما داریم از ارث بری استفاده میکنیم، اون کلاسی که ویژگی ها و متدهاشو به کلاس دیگه منتقل میکنه، بهش میگن کلاس پایه یا کلاس اصلی ( شما فرض کن پدر ) و اون کلاسی هم که ویژگی ها و متدهارو به ارث میبره میشه زیرکلاس یا کلاس مشتق (اینم میشه بچش)

👑ویژگی های ارث بری یا همون Inheritance چیه؟
کد تکراری کمتر: وقتی از ارث بری استفاده میکنیم، میتونیم کد های مشابه رو توی کلاس های مختلف به اشتراک بزاریم و هی تکرارشون نکنیم
سازماندهی بهتر : ارث بری این اجازه رو بمون میده که کلاس هارو به صورت سلسله مراتبی مدیریت و سازماندهی کنیم و ارتباط بین اونارو بهتر مدیریت کنیم
توسعه پذیری : وقتی زیرکلاس های جدید اضافه میکنیم میتونیم به سادگی رفتار ها و متد و ویژگی های جدید بهشون اضافه کنیم

حالا باهم یه مثال ببینیم:
class Animal {
constructor(name) {
this.name = name;
}

speak() {
console.log(`${this.name} makes a sound.`);
}
}

class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}

bark() {
console.log(`${this.name} barks!`);
}
}

const myDog = new Dog("Buddy", "Golden Retriever");
myDog.speak(); // Outputs: "Buddy makes a sound."
myDog.bark(); // Outputs: "Buddy barks!"


#oop #oop_6
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥6❤‍🔥3
🔥خوش اومدین به یه آموزش دیگه از سری آموزشی OOP ، امروز قصد داریم راجب تو مفهوم دیگه از OOP صحبت کنیم

💥چندریختی ( Polymorphism ) در OOP
چندریختی یکی از پایه‌های اصلی برنامه نویسی شیءگراس که مفهومش میشه همون چندشکلی یا قابلیت داشتن چندین شکل که البته واضحه. این مفهوم به آبجکت هامون این اجازه رو میده تا رفتار های متفاوتی برای یه متود یا یه عمل یکسان از خودشون نشون بدن. یعنی میتونیم یه متود رو چندین بار تعریف کنیم و کارای مختلفی باهاش کنیم با اینکه اسمشون یکیه

◀️ویژگی های چندریختی:
🔴کد تمیزتر و قابل نگهداری تر
🔴انعطاف پذیری بالا
🔴توسعه پذیری بالا

مثال زیر نحوه استفاده از چند ریختی در زمان بارگذاری متود ( Method Overloading ) رو نشونتون میده:
class Shape {
draw() {
console.log("Drawing a shape");
}

draw(width, height) {
console.log("Drawing a shape with width:", width, "and height:", height);
}
}

class Circle extends Shape {
draw() {
console.log("Drawing a circle");
}

draw(radius) {
console.log("Drawing a circle with radius:", radius);
}
}

const circle = new Circle();

circle.draw(); // Output: Drawing a circle
circle.draw(10); // Output: Drawing a circle with radius: 10

const shape = new Shape();
shape.draw(); // Output: Drawing a shape

☄️توی مثال بالا ما اومدیم و چندریختی رو روی متود draw پیاده کردیم و درسته چندین متود drow داریم ولی هرکدوم یه کار جدا میکنن و طبق ورودی خودش مشخص میشه دقیقا کدوم یکیش صدا زده بشه

👑وابستگی ( Dependency ) در OOP
وابستگی در OOP اشاره به ارتباط دوتا کلاس به هم داره که یعنی یه کلاس برای اینکه کارشو انجام بده نیاز به یه کلاس دیگه داره، این وابستگی ها هم میتونه به صورت مستقیم یا غیر مستقیم باشه

◀️ویژگی های وابستگی در OOP
🔵کد تمیز تر
🔵قابلیت ازمایش پذیری بیشتر
🔵انعطاف پذیری بالا
🔵استفاده مجدد

یه مثال هم از وابستگی باهم ببینیم:
class Animal {
constructor(name, soundMaker) {
this.name = name;
this.soundMaker = soundMaker;
}

makeSound() {
this.soundMaker.makeSound(this);
}
}

class SoundMaker {
makeSound(animal) {
console.log(`${animal.name} makes a ${animal.sound}`);
}
}

const dog = new Animal("Dog", new SoundMaker());
const cat = new Animal("Cat", new SoundMaker());

dog.makeSound(); // Output: Dog makes a bark
cat.makeSound(); // Output: Cat makes a meow


#oop #oop_7
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥84🔥2💔1
📌خوش اومدین به آخرین قسمت از سری آموزشی OOP و امروز هم قراره راجب 2 مفهوم دیگه از برنامه نویس شیءگرا بپردازیم

🔥ترکیب ( Composition ) در OOP
-ترکیب یه مفهوم پایه تو OOP به حساب میاد که این امکانو به ما میده که آبجکت هامون رو از یه آبجکت دیگه بسازیم. و خصوصیات و ویژگی های هردورو باهم ترکیب کنیم
ترکیب در اصل یه نوعی از ارتباط بین آبجکت هاس که توی اون یه آبجکت که آبجکت صاحب هست، تمام خصوصیات و ویژگی های یک یا چند آبجکت دیگه رو توی خودش جا میده، یعنی آبجکت صاحب از بقیه آبجکت های جزء به عنوان اجزاء خودش استفاده میکنه

◀️ترکیب ( Composition ) در OOP سه تا مرحله مهم داره
🔵تعریف کلاس های پایه
🔵ایجاد کردن رابطه ترکیب
🔵استفاده از خصوصیات شیء های جزء

مزایاش چیه؟
🔵قابلیت استفاده مجدد
🔵ماژولار بودن
🔵قابلیت نگهداری بالاتر

یه مثال ازش ببینیم:
class VendingMachine {
constructor(products, coins) {
this.products = products;
this.coins = coins;
}

selectProduct(productCode) {
const product = this.products.find(p => p.code === productCode);
if (!product) {
throw new Error("Invalid product code");
}
return product;
}

insertCoin(coinValue) {
this.coins.push(coinValue);
}

returnCoins() {
const totalCoins = this.coins.reduce((sum, coin) => sum + coin, 0);
this.coins = [];
return totalCoins;
}

dispenseProduct(productCode) {
const product = this.selectProduct(productCode);
const price = product.price;

const totalCoins = this.coins.reduce((sum, coin) => sum + coin, 0);
if (totalCoins < price) {
throw new Error("Insufficient funds");
}

const change = totalCoins - price;
this.coins = [];

console.log(`Here is your ${product.name}.`);
if (change > 0) {
console.log(`Your change is ${change} coins.`);
}
}
}

class Product {
constructor(code, name, price) {
this.code = code;
this.name = name;
this.price = price;
}
}

class Coin {
constructor(value) {
this.value = value;
}
}

// Create products and coins
const products = [
new Product("A1", "Snickers", 100),
new Product("B2", "Coke", 80),
new Product("C3", "Chips", 60),
];

const coins = [
new Coin(50),
new Coin(20),
new Coin(10),
];

// Create vending machine
const vendingMachine = new VendingMachine(products, coins);

// Simulate usage
vendingMachine.insertCoin(50);
vendingMachine.insertCoin(50);
vendingMachine.selectProduct("B2");
vendingMachine.dispenseProduct("B2");

console.log("Remaining coins:", vendingMachine.returnCoins());


💎واسط ( Interface ) ها در OOP
-یک واسط در OOP مجموعه‌ای از متدهارو تعریف میکنه که یه کلاس یا شیء باید اون مجموعه رو پیاده سازی کنه. واسط ها این قابلیت رو به ما میدن که بدون نیاز به وراثت، بین آبجکت هامون رفتار های مشابه ایجاد کنیم، دقت کنین توی زبان های مختلف ممکنه مفهومش متفاوت باشه، مثلا ما توی Javascript اگه بخایم از واسط ها استفاده کنیم باید بریم Typescript و اینترفیس تعریف کنیم که توی مثال باهم میبینیم

◀️مزایای استفاده از واسط ها:
🟢انعطاف پذیری بالا
🟢قابلیت استفاده مجدد
🟢طراحی شیءگرا

مثال استفاده از واسط ها:
interface Shape {
draw();
getArea();
}

class Circle implements Shape {
constructor(radius) {
this.radius = radius;
}

draw() {
console.log("Drawing a circle with radius", this.radius);
}

getArea() {
return Math.PI * this.radius * this.radius;
}
}

class Square implements Shape {
constructor(sideLength) {
this.sideLength = sideLength;
}

draw() {
console.log("Drawing a square with side length", this.sideLength);
}

getArea() {
return this.sideLength * this.sideLength;
}
}

// Create shapes
const circle = new Circle(5);
const square = new Square(10);

// Draw and calculate area
circle.draw();
console.log("Circle area:", circle.getArea());

square.draw();
console.log("Square area:", square.getArea());


🩷خب دوستان دیگه مباحث اصلی OOP تموم شد و ما سعی کردیم کامل و با مثال براتون توضیح بدیم امیدوارم از این سری آموزشی لذت برده باشین و ممنونیم از اینکه حمایتمون میکنین

#oop #oop_8
☕️ @CodeExplore
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥115❤‍🔥2