Constructor در جاوا اسکریپت – توضیح توابع سازنده به زبان ساده

۶۱۱ بازدید
آخرین به‌روزرسانی: ۳۰ مرداد ۱۴۰۲
زمان مطالعه: ۱۱ دقیقه
Constructor در جاوا اسکریپت – توضیح توابع سازنده به زبان ساده

توابع سازنده یا Constructor در جاوا اسکریپت یکی از مفاهیم کلیدی در جاوا اسکریپت و برنامه‌نویسی شیءگرا هستند. در این مطلب از مجله فرادرس قصد داریم تا به طور کامل با این مفهوم و کاربرد آن آشنا شویم. ابتدا تعریف Constructor را مرور می‌کنیم و می‌بینیم چگونه یک تابع Constructor ساخته می‌شود. سپس نحوه فراخوانی توابع Constructor و انواع آن‌ها را مثال‌های عملی بررسی می‌کنیم. در ادامه با تفاوت Constructor و کلاس در جاوا اسکریپت آشنا می‌شویم. در نهایت نیز نکات کلیدی را جمع‌بندی خواهیم کرد. پس همراه ما باشید تا دانش خود را در زمینه توابع Constructor در جاوا اسکریپت ارتقا دهید.

توابع سازنده یا Constructor در جاوا اسکریپت راه‌کارهایی برای ایجاد و مقداردهی اولیه «شی» (Object) هستند که امکان تعریف ویژگی‌ها و متدها را فراهم کرده و قابلیت استفاده مجدد کدهای برنامه را تقویت می‌کنند. همچنین «نمونه‌ها» (Instances) با استفاده از سازنده ساخته می‌شوند و به برنامه نویسی شی‌گرا کمک می‌کنند. در مطلب پیش رو از «مجله فرادرس» مفهوم توابع سازنده در جاوا اسکریپت با زبانی ساده و به همراه‌ مثال‌های عینی پوشش داده شده است. درک Constructor در جاوا اسکریپت به برنامه‌نویس‌ها کمک می‌کند که با چالش‌های کدنویسی به‌خصوص در رویکرد برنامه نویسی شی‌گرا بهتر و مجهزتر مواجه شوند.

تابع Constructor در جاوا اسکریپت چیست؟

تابع Constructor در جاوا اسکریپت به عنوان نوعی تابع معمولی، پایه‌ای برای ساخت اشیا است. به عنوان مثال، یک مهندس عمران اگر بخواهد مجموعه آپارتمانی شامل چندین ساختمان را بسازد، برای ساخت این مجموعه اول نقشه‌ای دقیق از پروژه ارائه کرده و سپس کار را به سایر افراد درگیر در پروژه مانند پیمانکار، کارگر و غیره می‌سپارد. در این پروژه اگر همه واحدهای آپارتمانی ‌یک شکل باشند، فقط از این نقشه استفاده می‌شود و در این صورت هر آپارتمان (شی) بر اساس نقشه ارائه شده (تابع سازنده) ساخته خواهد شد. در نهایت، مجموعه‌ای از چندین آپارتمان پدیدار می‌شود که همگی از طرح و نقشه اولیه واحدی استفاده کرده‌اند.

مزیت کلیدی این روش در توانایی تکرار طرح و ایجاد آرایه‌ای از ۲۰، ۵۰۰، ۱۰۰ یا بیشتر اشیای مشابه با ویژگی‌های متمایز است. تابع سازنده در جاوا اسکریپت به کاربر این امکان را می‌دهد که فقط یک بار چارچوب شی را ایجاد کند و سپس از این چارچوب برای ایجاد اشیای مشابهی می‌تواند بهره ببرد. توابع سازنده نقش مهمی در ایجاد اشیا در جاوا اسکریپت ایفا کرده و به عنوان الگوهایی برای ایجاد موجودیت‌های متعددی عمل می‌کنند که ویژگی‌ها و متدهای یکسانی را با حفظ مقادیر متنوع به اشتراک می‌گذارند.

تابع constructor در جاوا اسکریپت

نمونه ای از Constructor در دنیای واقعی

فرض بر این است که فردی توسعه‌دهنده در حال ساخت نوعی وب‌سایت رسانه اجتماعی است. این توسعه‌دهنده باید بداند که قصد جمع‌آوری چه اطلاعاتی را دارد. برای انجام این کار، توسعه‌دهنده برای هر کاربر چیزی شبیه به فرم ایجاد می‌کند تا از کاربران اطلاعات لازم را بگیرد. برای نشان دادن این روند، سناریوهای زیر را در نظر بگیرید:

  • اطلاعات یکسان کاربر: در ثبت‌نام هر کاربر گرفتن مجموعه‌ای از اطلاعت کاربر مانند نام، نام‌خانوادی، سن و غیره الزامی است. در نتیجه، اشیایی که برای جمع‌آوری داده‌های کاربراهای متنوع طراحی شده‌اند، ویژگی‌های مشابهی را به اشتراک می‌گذارند.
  • در نظر گرفتن مقیاس: فرض می‌شود روزانه مثلا هزاران نفر با این پلتفرم شبکه اجتماعی در تعامل هستند. برای مقیاس‌بندی کردن با این حجم از کاربران، اشیای متعددی باید برای مدیریت و پردازش مؤثر داده‌های متمایز هر کاربر ایجاد شوند.

در سناریوی بالا، Constructor در جاوا اسکریپت طرح یا الگوی مورد استفاده برای ایجاد اشیای جدید است که برای هر کاربری که در پلتفرم ثبت‌نام می‌کند لازم خواهد بود و با استفاده از آن با کدنویسی بسیار کمتری کاربر توسعه‌دهنده به هدف خود که در این سناریو جمع‌آوری اطلاعات از کاربران است، دست می‌یابد.

ایجاد توابع Constructor در جاوا اسکریپت

ساخت توابع سازنده شبیه به ایجاد توابع معمولی جاوا اسکریپت است. در زیر مثالی برای نشان دادن این موضوع آورده شده است. تصور کنید مانند بالا فردی توسعه‌دهنده در حال ساخت نوعی سایت رسانه اجتماعی بوده و می‌خواهد اطلاعاتی را از کاربران جمع‌آوری کند. برای این هدف فرد توسعه‌دهنده نوعی تابع ویژه به نام User ایجاد می‌کند که شامل سه چیز است: نام، نام‌خانوادگی و سن کاربر. این تابع به او کمک می‌کند تا پروفایل‌های کاربری متفاوتی ایجاد کند. قطعه کد زیر این موضوع را نشان می‌دهد:

1function User(firstName, lastName, age) {
2    this.firstName = firstName;
3    this.lastName = lastName;
4    this.age = age;
5}

در کد بالا تابعی با نام User مانند طرحی اولیه عمل می‌کند. این تابع به فرد برنامه‌نویس اجازه می‌دهد تا تعداد زیادی پروفایل کاربری جدید برای سایت رسانه اجتماعی خود ایجاد کند. در رابطه با Constructor در جاوا اسکریپت توجه به دو نکته زیر مهم است:

  1. بهتر است نام تابع سازنده با حرف بزرگ شروع شود. انجام این کار اجباری نیست اما به کاربر کمک می‌کند توابع سازنده را از توابع معمولی جدا کند.
  2. هنگام کار با توابع سازنده در جاوا اسکریپت از کلمه کلیدی This در جاوا اسکریپت زیاد استفاده می‌شود. این کلمه کلیدی برای اشاره به شیئی که کاربر ایجاد کرده مورد استفاده قرار می‌گیرد.
توابع constructor در جاوا اسکریپت

کلمه کلیدی This در جاوا اسکریپت

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

  • در داخل شی: هنگامی‌که کلمه کلیدی نام برده در داخل شیئی استفاده می‌شود، this به آن شی خاص اشاره دارد.
  • در محدوده سراسری: اگر خارج از هر شی خاصی استفاده شود، مانند قسمت اصلی کد، this به زمینه بزرگ‌تر اشاره دارد که معمولاً کل صفحه‌وب یا محیط سراسری را شامل می‌شود.
  • در توابع یا کلاس‌های سازنده: وقتی این کلمه کلیدی در داخل تابعی خاص قرار می‌گیرد که اشیا ایجاد می‌کند (تابع سازنده یا کلاس)، this نشان‌دهنده شی خاصی است که در آن لحظه ایجاد می‌شود.

به عبارت ساده‌تر، کلمه کلیدی this به کاربر کمک می‌کند جزئیات یا اقداماتی را به اشیای مختلف اضافه کند. به عنوان مثال، هنگام ساخت بسیاری از اشیای مشابه، مانند پروفایل کاربر در مثال بالا، برنامه‌نویس نمی‌خواهد به هر کدام از اشیا نام منحصربه‌فردی بدهد. در عوض، از this برای سفارشی‌سازی و ساخت هر شی به طور جداگانه استفاده می‌کند. بنابراین، this مانند ابزاری است که به کاربر امکان می‌دهد ویژگی‌های خاصی را به اشیا اضافه کند، به خصوص اگر این اشیا همگی از یک طرح اولیه ساخته شده باشند.

فراخوانی تابع سازنده در جاوا اسکریپت

برای استفاده از تابع Constructor در جاوا اسکریپت، از کلمه کلیدی New به همراه داده‌های واقعی ارائه شده استفاده می‌شود که مثال زیر این موضوع را نشان می‌دهد:

1let user1 = new User("John", "Doe", 23);

در کد بالا، شی (نمونه) خاصی از سازنده User تولید می‌شود که شامل سه مؤلفه زیر است:

Firstname as ‘John’
Lastname as ‘Doe’
Age as 23.

کلمه کلیدی New عملگری برای ایجاد اشیای جدید از توابع سازنده است. هنگامی‌که از کلمه کلیدی New با یک تابع سازنده استفاده شود، کارهای زیر را انجام می‌دهد:

  1.  شی تازه و خالی ایجاد می‌کند.
  2. نمونه اولیه این شی جدید را تنظیم کرده و آن را به ویژگی نمونه اولیه تابع سازنده متصل می‌کند.
  3. کلمه کلیدی this تابع سازنده را طوری تنظیم می‌کند که به شی جدید ایجاد شده اشاره کند.
  4. کلمه کلیدی New تابع سازنده را وادار می‌کند که شی جدید را بازگرداند.

در مثال زیر، تابعی به نام newClone رفتار عملگر New را تقلید می‌کند:

1
2//This function mimics the new operator
3function newClone(ConstFunction, ...theArgs) {
4  
5    //1. Creates a new empty object
6  let obj = {};
7 
8  //2. Sets prototype of newly created object and links to it to prototype  property of constructor function.
9  Object.setPrototypeOf(obj, ConstFunction.prototype)
10 
11  //3. calls the ConstFunction using `call` and sets the new object (obj) as its 'this' keyword.
12  let ret = ConstFunction.call(obj, ...theArgs)
13  
14  //4. if it returns Object then returns it as it is
15  if (ret == Object) return ret
16 
17  //else return obj
18  return obj;
19}
20 
21//Person created using the NewClone
22const userClone  = newClone(User, 'John', 'Doe', 23)
23console.log(userClone );
24 
25//Person created using the new operator
26const user1 = new User('John', 'Doe', 23)
27console.log(user1);

هر دو شی newClone و user1 نتیجه یکسانی دارند:

1{
2"firstName": "John",
3"lastName": "Doe"
4 age: 23
5}

 اضافه کردن متدها به سازنده ها

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

برنامه نویس در حال کار با لپ تاپ

١. در داخل سازنده

می‌توان متد را مستقیماً در تابع سازنده ایجاد کرد. به عنوان مثال، در سازنده User ، می‌توان متدی به نام speak مانند مثال زیر اضافه کرد:

1function User(firstName, lastName, age){
2    
3    // defined properties
4    
5    //Adding method
6    this.speak = function() {
7        console.log("Hello! My name is " + this.firstName + " " + this.lastName + " and I'm " + this.age)+" years old.";
8    }
9}

۲. استفاده از نمونه‌های اولیه

راه دیگر افزودن متدها به توابع سازنده در جاوا اسکریپت، استفاده از نمونه‌های اولیه است. این رویکرد روشی خاص برای به اشتراک گذاشتن متدها در بین تمام اشیا ایجاد شده از سازنده است. برای مثال، می‌توان متدی به نام getFullName با استفاده از نمونه‌های اولیه به سازنده User مانند مثال زیر اضافه کرد:

1function User(firstName, lastName, age){
2    
3    // defined properties  
4}
5
6User.prototype.getFullName = function() {
7    console.log(this.firstName + " " + this.lastName);
8}
9 
10user1 = new User("John", "Doe", 23);
11user1.getFullName() // John Doe

با افزودن متدها از طریق نمونه‌های اولیه، تمام اشیای ساخته شده از سازنده User می‌توانند از متد جدید استفاده کنند که راهی برای در دسترس قرار دادن عملی مشابه برای همه اشیای مشابه است.

انواع توابع Constructor در جاوا اسکریپت چه هستند؟

دو نوع اصلی توابع Constructor در جاوا اسکریپت وجود دارد که شامل توابع سازنده تعریف شده به وسیله کاربر و توابع سازنده داخلی هستند. هرکدام از این توابع کاربردهای خاص خودشان را دارند و در سناریوهای مختلفی می‌توان از آن‌ها استفاده کرد. در ادامه توضیحاتی در رابطه با هرکدام از انواع توابع سازنده در جاوا اسکریپت آورده شده است.

١. توابع سازنده تعریف شده به وسیله کاربر

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

٢. توابع سازنده داخلی

جاوا اسکریپت توابع سازنده داخلی را برای هر نوع داده اولیه، مانند «رشته» (استرینگ | String)، عدد، بولی و شی فراهم می‌کند. برای مثال قطعه کد زیر چند نمونه از توابع سازنده داخلی در جاوا اسکریپت را نشان می‌دهد:

1const str = new String("string") //A new string object.
2const num = new Number(56) //A a number object.
3const bool = new Boolean(true) //A new boolean object.
4const arr = new Array([23,32]) //A new JavaScript array.
5const obj = new Object({"name":"Joe"}) //A new JavaScript object.
6
7//Display types
8console.log(typeof str) //object
9console.log(typeof num) //object
10console.log(typeof bool) //object
11console.log(typeof arr) //object
12console.log(typeof obj) //object

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

توابع سازنده داخلی
برنامه نویس در حال کار با لپ تاپ

نمونه های اولیه شی در جاوا اسکریپت

جاوا اسکریپت نوعی زبان پویا است که به کاربر این امکان را می‌دهد تا در هر مکان و زمانی ویژگی‌های جدیدی را به اشیا اضافه کند. مثال زیر این موضوع را نشان می‌دهد:

1function Person() {
2    this.name = 'John Doe';
3    this.occupation = 'Developer';
4}
5
6const person1 = new Person();
7person1.age = 34;
8console.log(person1.age); // 34
9
10const person2 = new Person();
11console.log(person2.age); // undefined

در کد بالا، ویژگی age فقط در شی person1 وجود دارد، نه person2 ، زیرا فقط به person1 اضافه شده است. اما چگونه می‌توان ویژگی‌های جدیدی را پس از تعریف تابع سازنده به آن اضافه کرد و آن‌ها را برای همه نمونه‌های شی در دسترس قرار داد؟ پاسخ این سؤال در چیزی به نا، «نمونه اولیه» یا Protoype در جاوا اسکریپت نهفته است.

در جاوا اسکریپت، هر تابعی با مؤلفه‌ای خاص به نام «نمونه اولیه» (Protoype) همراه است. نمونه اولیه در ابتدا شیئی خالی در داخل تابع محسوب می‌شود و تا زمانی که تابع به عنوان سازنده استفاده نشود، غیرفعال می‌ماند. ویژگی نمونه اولیه تابع Constructor در جاوا اسکریپت به عنوان نمونه اولیه برای تمام اشیای ایجاد شده از آن تابع عمل می‌کند. توجه به مثال زیر و نتیجه آن در این رابطه بسیار مهم است:

1function Person() {
2    this.name = 'John Doe';
3    this.occupation = 'Developer';
4}
5
6const person1 = new Person();
7person1.age = 34;
8console.log(person1.age); // 34
9
10const person2 = new Person();
11console.log(person2.age); // undefined

همان‌طور که در نتایج مشاهده می‌شود، هر دو نمونه شی ایجاد شده از سازنده Person اکنون می‌توانند به ویژگی age که در نمونه اولیه سازنده Person قرار دارد دسترسی داشته باشند. این رویکرد نمونه اولیه ویژگی‌های مشترک را در بین نمونه‌ها فعال می‌کند.

تفاوت اشیای ساخته شده با سازنده و اشیای واقعی در جاوا اسکریپت

دو رویکرد برای ایجاد اشیا در جاوا اسکریپت موجود است که شامل «اشیای تحت‌ اللفظی »(Object literal) (به معنی اشیای واقعی) و سازنده‌ها هستند. رویکرد اشیای تحت‌ اللفظی شامل تعریف مستقیم خصوصیات و مقادیر شی است. به عنوان مثال کد زیر جزئیات مربوط به ٣ دانش آموزان را می‌گیرد. برای دانش آموز اول باید به صورت زیر عمل کند:

1const student1 = {
2    firstName: "Jermaine",
3    lastName: "Cole",
4    age: 32
5}

برای دانش آموزش دوم به صورت زیر است:

1const student2 = {
2    firstName: "Kendrick",
3    lastName: "Lamar",
4    age: 24
5}

برای دانش آموز سوم به صورت زیر است:

1const student3 = {
2    firstName: "Jake",
3    lastName: "Williams",
4    age: 36
5}

راه سریع‌تری برای ساخت شی student وجود دارد. به جای ایجاد دستی هر شی student با استفاده شی واقعی، می‌توان از سازنده استفاده کرد. این شامل طراحی تابعی است که به عنوان طرحی برای تولید هر تعداد شی student عمل کند. در اصل روش دوم استفاده از رویکرد توابع سازنده است. روش اول به‌ویژه در سناریوهایی که اشیای متعدد موجود هستند، کارآمدی کمتری دارد و روش دوم تا حدودی این مشكل را حل کرده است. در این روش به‌جای تکرار جزئیات، می‌توان الگو یا تابع Constructor در جاوا اسکریپت را برای تولید اشیا استفاده کرد. مثال زیر برای بیان این موضوع است:

1function Student(firstName,lastName,age) = {
2    this.firstName = firstName
3    this.lastName = lastName
4    this.age = age
5}
6
7const student1 = new Student("Jermaine", "Cole", 23);
8const student2 = new Student("Kendrick", "Lamar", 32);
9const student3 = new Student("Jake", "Williams", 36);

تمایز دو رویکرد بالا در اثربخشی آن‌ها نهفته است. رویکرد اشیای واقعی نیاز به تعیین نوع اضافی برای هر شی دارد، در حالی که رویکرد استفاده از توابع سازنده شامل طراحی تابعی الگو محور به‌منظور ساده‌سازی فرآیند تولید چندین شی است. در اصل، هنگامی‌ که کاربر با شیئی منفرد با ویژگی‌های خاص سروکار داشته باشد، استفاده از رویکرد اشیای واقعی انتخاب مناسب‌تری است. در همین حال، هنگام برخورد با مجموعه‌هایی زیادی از اشیا که هر کدام دارای ویژگی‌های مشابه هستند، توابع Constructor در جاوا اسکریپت انتخاب بهتری محسوب می‌شود. این رویکرد نه‌تنها سریع‌تر است، بلکه سازمان‌دهی کدها را نیز بهبود می‌بخشد.

برنامه نویس در حال کار

تفاوت کلاس و Constructor در جاوا اسکریپت

جاوا اسکریپت به دلیل رویکرد منحصربه‌فردش که به‌جای کلاس‌ها بر سازنده‌ها و نمونه‌های اولیه تکیه می‌کند، در میان دیگر زبان‌های برنامه‌نویسی شی‌گرا متمایز است. در واقع، برای دوره‌ای قابل‌توجه در جاوا اسکریپت حتی چیزی به نام کلاس وجود نداشت. معرفی کلاس‌های جاوا اسکریپت در «ECMAScript 2015» هیچ قابلیت جدیدی برای خود زبان به ارمغان نیاورد. در عوض، کلاس‌ها به عنوان شکلی از «قند نحوی | به معنای کد خوانا و راحت» (Syntactic Sugar) عمل کرده و خوانایی و نوشتن کد را بر روی توابع Constructor موجود ساده می‌کنند.

کلاس‌ها و توابع Constructor در جاوا اسکریپت به هم مرتبط هستند و شباهت‌هایی در نحوه کار و دستاوردهایشان دارند. در حالی که آن‌ها ممکن است از سینتکس متفاوتی استفاده کنند و تفاوت‌هایی با هم داشته باشند اما هدف اساسی یکسانی را از ایجاد اشیا و تعریف ویژگی‌ها و رفتار آن‌ها دنبال می‌کنند. برای تعریف کلاس جاوا اسکریپت، از کلمه کلیدی class استفاده می‌شود که مثال زیر این موضوع را بیان می‌کند:

1class Person {
2  constructor(name) {
3    this.name = name;
4  }
5}
6// creating an object
7const person1 = new Person('John');
8const person2 = new Person('Jack');

در داخل اعلان کلاس، می‌توان متدی به نام Constructor() را وارد کرد که عملکردی مشابه تابع سازنده دارد. این متد سازنده از اختصاص دادن خصوصیات در کلاس مراقبت می‌کند. وجود متد Constructor() در اعلان کلاس بر این واقعیت تأکید خواهد کرد که کلاس‌های جاوا اسکریپت اساساً بر اساس توابع سازنده ساخته شده‌اند.

سخن پایانی

توابع Constructor در جاوا اسکریپت به عنوان طرح اولیه برای ایجاد اشیا با ویژگی‌ها و متدهای از پیش تعریف شده عمل می‌کنند. این توابع رویکردی ساختاریافته برای نمونه‌سازی کارآمد شی ارائه خواهند کرد. سازنده‌ها چه از توابع سازنده معمولی استفاده کنند و چه از سینتکس کلاس محور، سازمان‌دهی کد و قابلیت استفاده مجدد را افزایش می‌دهند. یادگیری سازنده‌ها، توسعه‌دهندگان را قادر می‌سازد تا به طور کارآمد اشیا را مدیریت و دست‌کاری کرده و این به ایجاد برنامه‌های قوی‌تر و با قابلیت نگهداری بالا کمک می‌کند. با درک این مفهوم اساسی، توسعه‌دهندگان می‌توانند از پتانسیل کامل قابلیت‌های برنامه نویسی شی‌گرا در جاوا اسکریپت بهره ببرند.

در مطلب فوق از مجله فرادرس توابع Constructor و نحوه کار آن‌ها به زبانی ساده و در قالب مثال‌هایی ارائه شد. همچنین نحوه ایجاد و فراخوانی این توابع، انواع آن‌ها، تفاوت آن‌ها با نمونه‌های اولیه و همچنین فرق آن‌ها با کلاس‌ها نیز مورد بررسی قرار گرفت. به امید اینکه مطلب فوق مورد رضایت کاربران مجله قرار گرفته باشد.

بر اساس رای ۴ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
HackMd
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *