شما اینجا هستید

۹-۱ تفاوت بین بین توابع ثابت و پویا

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

قبل از اینکه بخواهیم الگوریتم ۳(شتاب در جهت نشاگر موس) را پیاده سازی کنیم، نیاز است که در مورد جنبه ی مهمی از کار با بردار ها و کلاس PVector را توضیح دهیم:

تفاوت بین بین توابع ثابت و پویا.

برای چند مدتی بردار ها را فراموش کنید، به کد زیر نگاه کنید:

 float x = 0;
float y = 5;
x = x + y; 

بسیار ساده است، نه؟ x مقدار صفر گرفته است، در خط سه مقدار x برابر پنج شده است. می توانیم قطعه کد بالا را با استفاده از چیز هایی که درمورد Pvector ها یاد گرفته ایم بازنویسی کنیم.

 PVector v = new PVector(0,0);
PVector u = new PVector(4,5);
v.add(u); 

بردار v مقادیر (.,.) را گرفته است، ما می توانیم u را به آن اضافه کنیم، حالا v برابر مقادیر (۴,۵) شده است.راحت بود ، درسته؟ اجازه بدهید به مثال ساده ریاضی از ممیز شناور نگاهی بیندازیم:

 float x = 0;
float y = 5;
 
float z = x + y; 

x مقدار 0 را گرفته است، ما y را به آن اضافه می کنیم، و نتیجه را در متغییر جدید z ذخیره می کنیم. در مثال ما مقدار x تغییر نکرد( مقدار y هم تغییر نکرد). این نکته خیلی مهم است، این موضوع وقتی شروع به کار با عملیات های ریاضی روی اعداد ممیز شناور می کنیم، سرچشمه بسیاری از ابداعات است. این موضوع وقتی علملیات های ریاضی روی Pvector انجام می دهیم زیاد واضح نیست. اجازه بدهید کد را براساس آنچه تا کنون می دانیم بازنویسی کنیم.

PVector v = new PVector(0,0);
PVector u = new PVector(4,5);
        
خط زیر درست نیست!!!

PVector w = v.add(u);   

شاید کد بالا به نظر درست بیاید، اما کلاس PVector اینگونه کار نمی کند. اگر به تعریف تابع add نگاهی بیندازیم...

void add(PVector v) {
    x = x + v.x;
    y = y + v.y;
 }  

همانطور که می بینید این کد هدف ما را نمی رساند. اول اینکه، این کد یک PVector جدید برنمی گرداند( نوع برگشتی void است) و دوم اینکه، این کد مقادیر PVector که با آن فراخوانی شده است را تغییر می دهد. برای رسیدن به اینکه دو شی PVector را با هم جمع کنیم و نتیجه را به شکل یک PVector جدید برگردانیم، ما باید از تابع ثابت add استفاده کنیم. تابع های که فراخوانی از درون یک کلاس فراخوانی می کنیم( به جز مورد های از شی های خاص) به عنوان توابع static نامیده می شوند. در زیر دو مثال از فراخوانی توابع را داریم. دو شی PVector با نام های v و u را در نظر بگیرید:

PVector.add(v,u);

غیر استاتیک ، از درون یک نمونه از شی صدا زده شده است.

  v.add(u); 

اگرچه شما نمی توانید خودتان توابع استاتیک را در processing بنویسید، ممکن است قبل از این با آنها برخورد داشته باشید. توابع استاتیک PVector به ما اجازه عملیات های ریاضی عمومی روی شی های PVector را بدون اینکه یک از ورودی های PVector را تغییر دهند، می دهد. بیایید نگاهی نگاهی به اینکه چطور ما می توانیم نسخه استاتیک تابع add را بنویسیم داشته باشیم:

 static PVector add(PVector v1, PVector v2) {
    PVector v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
    return v3;
  } 

نسخه استاتیک add به ما اجازه می دهد دو شی PVector را با هم جمع کنیم و نتیجه را به صورت PVector جدید داشته باشیم بدون اینکه Pvector های اصلی (در بالا u و v) تغییری بکنند.

در اینجا چند تفاوت وجود دارد:

تابع که با برچسب static آمده است.

نوع بازگشتی تابع void نیست، به جای آن PVector را برمیگرداند.

تابع Pvector جدیدی(v3) می سازد و مجموع اجزاء v1 و v2 را بر می گرداند.

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

  PVector v = new PVector(0,0);
PVector u = new PVector(4,5);
خط زیر اشتباه است!
PVector w = v.add(u);
این خط صحیح است
PVector w = PVector.add(v,u); 

کلاس PVector ورژنهای استاتیک این توابع را دارد: add, sub, mult, div

تمرین ۱-۷

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

PVector با نام v برابر مقادیر (۱,۵)

PVector با نام u برابر ضرب v در ۲

PVector با نام v برابر مقادیر v منهی u

تقسیم PVector با نام w بر ۳

 

 PVector v = new PVector(1,5);
PVector u = ________._____(__,__);
PVector w = ________._____(__,__);
___________; 

دیدگاه جدیدی بگذارید