Skip to main content

حتما دیدید وبسایت هایی مثل یوتوب، به چه شکلی پارامترها رو به URL پاس میدن. در واقع وقتی ما یک درخواست ویدئو به یوتوب میدیم، یوتوب اون رو به این شکل به متد watch خودش میفرسته :

youtube.com/watch?v=VIDEOCODE

و حالا اگر درخواست مشابهی بدیم و اون ویدئو در یک Playlist خاص باشه، URL به این شکل تغییر میکنه و ما یک پارامتر دیگه هم برای Query در دیتابیس یوتوب داریم :

youtube.com/watch?v=VIDEOCODE&list=LISTCODE

به این نوع پارامترها، پارامتر دلخواه گفته میشه. پارامتر دلخواه (Optional Parameter ) برای اینه که ما همیشه برای ایجاد یک پرس و جو در پایگاه داده، نیازی به همه پارامترها نداریم. گاهی فقط پاس دادن یک اسم کافیه، گاهی هم نیازه مثلا اسم و فامیل پاس داده بشه. یا مثلا برای جست و جو در یک وبلاگ عنوان متن عموما کافیه. خب؛ الان که میدونیم این پارامترها چی هستن و کجا به کار میان، بیایم در مورد پیاده سازی این نوع پارامترها در سیناترا صحبت کنیم.

سناریو

قراره که برنامه ای بنویسیم که در متدی به اسم greeter با دریافت پارامتر دلخواهی، به اسم داده شده در متغیر name سلام کنه. یعنی URL ما چنین چیزی خواهد بود :

example.com/greeter?name=GIVENNAME

پیاده سازی

برای پیاده سازی، فقط کافیه که یک پروژه سیناترا ایجاد کرده و کتابخانه های لازم رو لود کنید. سپس متد greeter رو به این شکل بنویسیم :

get '/greeter' do 
 name = params['name'] 
 'Hello, #{name}' 
end

به این شکل، ما میتونیم URL رو همونطوری که خواستیم وارد کنیم. اما ببینیم که نتیجه چی میشه؟

اگر صرفا این درخواست به سمت سرور بره :

GET /greeter

سرور متن Hello رو بدون هیچ اسمی، به ما برمیگردونه. اما وقتی درخواست به این صورت ارسال بشه :

GET /greeter?name=Sam

در پاسخ دریافتی از سرور عبارت Hello, Sam مشاهده میشه.

در پایان، امیدوارم که این مطلب به دردتون خورده باشه و بتونید ازش استفاده لازم رو ببرید 🙂

در قسمت دوم، یاد گرفتیم که چطور پیج هایی که ساختیم رو نمایش بدیم! در این قسمت، میخوایم مستقیما با دیتابیس وارد مذاکره بشیم! در واقع در این قسمت میخوایم به کاربر اجازه بدیم که خودش یک پیج ایجاد کنه. خیلی هم شیک و ساده. ابتدا این قسمت رو به main.rb اضافه کنید :

get '/pages/new' do
	@page = Page.new
	erb :new
end

در اینجا، گفته شده که یک صفحه به اسم new.erb خونده و نمایش داده بشه. علاوه بر اون، گفتیم که از کلاس Page هم یک شیء جدید برامون بسازه. حالا، فایل new.erb رو به این شکل ایجاد کنید :

<h1> New Page </h1>
 
<form action="/pages" method="post">
	<h2> Title: </h2>
	<input type="text" name="page[title]">
	<h2> Text: </h2>
	<textarea name="page[text]" cols="50" rows="5">
	</textarea>
	<br/>
	<input type="submit">
</form>

در اینجا یک فرم ایجاد کردیم که با متد POST کار میکنه. قبل تر، در مورد متد پست توضیح دادیم، و میتونید این مطلب رو در موردش بخونید تا درکش کنید!

بسیار خوب، الان برای این که برنامه ما درست و حسابی کار کنه، فقط نیاز داریم که با یک متد POST بهش بفهمونیم که اطلاعات رو توی دیتابیس بنویسه. و خب این قسمت رو به main.rb مون اضافه میکنیم :

post '/pages' do
	page = Page.create(params[:page])
	redirect to("/pages/#{page.id}")
end

خب، در اینجا میگیم که پیجی با پارامتر هایی که داده شده بساز، و بعدش برگرد به همون پیج. به همین سادگی!

جمع بندی

در کل این سه قسمت آموزش، یک CMS بسیار ساده ساختیم که یه ادیتور داشت و میتونست نوشته های ما رو توی یک دیتابیس ذخیره کنه و بعد به ما نشون بده. کل فایل main.rb ما به این شکل در اومد :

require 'sinatra'
require 'mongoid'
 
configure do
	Mongoid.load!("./database.yml")
end
 
class Page
	include Mongoid::Document 
	field :title, type: String
	field :text,  type: String
end
 
 
get '/pages' do
	@pages = Page.all
	@title = "Page List"
	erb :index
end
 
get '/pages/new' do
	@page = Page.new
	erb :new
end
 
post '/pages' do
	page = Page.create(params[:page])
	redirect to("/pages/#{page.id}")
end
 
get '/pages/:id' do
	@page = Page.find(params[:id])
	@title = @page.title
	erb :show
end

و کل ساختار فولدرهای ما به این شکل در اومد :

simple-cms/
├── database.yml
├── main.rb
├── README.md
└── views
    ├── index.erb
    ├── new.erb
    └── show.erb

با استفاده از چنین الگویی، شما قادرید که برنامه های واقعی تری بنویسید و از اونها در دنیای واقعی استفاده کنید. در قسمت اول ذکر شد که این CMS بدرد وبلاگ و وبسایت و … نمیخوره. دلیلشم مشخصه! توی این برنامه هیچگونه پرمیشن و سشن و … ای رعایت نشده که بدونیم کدوم یوزر میتونه پیج ایجاد کنه کدوم نمیتونه و این قضایا. یعنی امنیت نداره کانتنتی که روی اون وبسایت تولید میشه. شما میتونید با خوندن داکیومنت در مورد session ها این مورد رو هم هندل کنید و CMS کامل تری بسازید!

موفق باشید 🙂

در قسمت قبل، یاد گرفتیم که چگونه یک سیستم مدیریت محتوای کوچولو رو با پایگاه داده هاش، ایجاد کنیم. در این قسمت، نمایش محتوای پیج در لینک اختصاصی و همچنین نمایش لینک ها در صفحه اصلی رو بررسی میکنیم.

آموزش این قسمت، کوتاه تر از دفعات پیش هستش، دلیلشم اینه که در بخش آخر، باید متد POST رو بررسی کنیم (اگرچه در مقاله ای قبلا این کار رو کردیم، اما میخوایم دوباره آموزش تکرار بشه و یه استفاده عملی از این موضوع داشته باشیم).

بسیار خوب، فایل index.erb که صفحات ما رو نشون میداد باز کنید، به این شکل تغییرش بدید :

<h1> Pages </h1>
<% if @pages.any? %>
<p>
<%  @pages.each do |page| %>
<a href="/pages/<%= page.id %>">
<h1><%= page.title %> </h1>
</a>
<p> <%= page.text %> </p>
<% end %>
</p>
<% else %>
<h1> No pages added! </h1>
<% end %>

دقت کردید؟ ما از id صفحات برای تولید لینک به اون ها استفاده میکنیم!

حالا بیاید کمی فکر کنیم، وقتی روی این لینک ها کلیک کنیم چه اتفاقی میفته؟ طبیعتا یه ارور ۴۰۴ به ما نشون داده میشه و به ما گفته میشه که صفحه یافت نشده. معمولا سیناترا به صورت پیشفرض یک راهنمایی کوچک هم میکنه که چه چیزی باید به فایل main.rb و … اضافه کنیم تا بتونیم نتیجه درستی بگیریم.

حالا برای این که لینک ها ما رو به جای درستی راهنمایی کنند، کافیه که فایل main.rb رو باز کنیم و این خطوط رو بهش اضافه کنیم :

get '/pages/:id' do
	@page = Page.find(params[:id])
	@title = @page.title
	erb :show
end

خب توی این کد، میگیم که پیج ها رو بر اساس id شون پیدا کنه، و تیتر صفحه رو هم تیتر پیج ایجاد شده بذاره. و در نهایت هم میگیم که ظاهر برنامه در show.erb هست. حالا، نیاز داریم که یک show.erb هم بنویسیم :

<h1><%= @page.title %> </h1>
<p>
<%= @page.text %>
</p>
<a href="/pages"> Back to main page </a>

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

توی این نوشته، قصد و هدف اینه که بیایم و با استفاده از فرمورک Sinatra و دیتابیس غیررابطه ای MongoDB ، یک سیستم مدیریت محتوای کوچیک بنویسیم.


دقت کنید که این CMS صرفا یک کار آموزشی بوده و برای استفاده به عنوان CMS اصلی وبلاگ/وبسایت شما به هیچ وجه مناسب نیست

بسیار خوب، برای این که بدونیم از کجا شروع کنیم، ابتدا بیایم ببینیم که از چه چیزهایی قراره که استفاده بشه :

  1. فرمورک سیناترا
  2. ارتباط دهنده شیء – مستند (ODM) برای Mongo (اینجا از Mongoid استفاده میکنیم).

خب، ابتدا بیایم Gemfile رو بنویسیم :

source 'https://rubygems.org'
 
gem 'sinatra'
gem 'mongoid'

بسته به نیازتون، میتونید جم های دیگری هم بهش اضافه کنید.

حالا، باید به برنامه بفهمونیم که دیتابیس ما چه ویژگی هایی باید داشته باشه، پس یک فایل database.yml ایجاد میکنیم و این ها رودرونش مینویسیم :

development:
 clients:
  default:
   database: myCMS
   hosts:
    - localhost:27017
 production:
  clients:
   default:
    uri: <%= ENV['MONGOHQ<em>URL'] %>
    options:
     skip_version_check: true
safe: true

حالا دو مرحله اساسی کارمون انجام شده، هم میدونیم که دیتابیس چه ویژگی هایی داره و هم میدونیم که چه چیزهایی برای درست اجرا شدن برناممون نیازه.

حالا، وقتش رسیده که یک برنامه ساده بنویسیم:

require 'sinatra' 
require 'mongoid'
 
configure do
	Mongoid.load!("./database.yml")
end

این رو در فایلی به اسم main.rb نوشته و ذخیره میکنیم. حالا میتونیم تستش کنیم!

اما این کد، هنوز هیچ چیز قابل دسترسی ای نداره. توی main.rb یک کلاس به اسم Page به این شکل مینویسیم، که بشه مدل ما :

class Page
	include Mongoid::Document
	field :title , type: String
	field :text  , type: String
end

خب، حالا میتونیم برای ساختن صفحاتمون اقدام کنیم. ابتدا از طریق شل اینتراکتیو روبی، یک صفحه نمونه میسازیم :

~:$ irb -r ./main.rb

وقتی که شل اینتراکتیو باز شد، این دستورات رو میتونیم توش تایپ کنیم :

hello = Page.new
hello.title = "Hello, World!"
hello.text  = "This is first page on this CMS!"

حالا ما یک صفحه ساختیم. این ساخته شدن میتونه به این شکل هم انجام بشه :

Page.create(title:"My second page", text:"This is second page I added to this CMS!")

بسیار خوب، الان صفحه ها ساخته شده! پس چطوری میتونیم اطلاعاتشون رو نمایش بدیم؟!

برگردیم توی main.rb و این قطعه کد رو اضافه کنیم :

get '/pages' do
	@pages = Page.all
	@title = "Page List"
	erb :index
end

خب، یک پوشه به اسم views باید ایجاد کنیم، یک فایل به اسم index.erb هم درونش قرار میدیم ، و این ها رو در ایندکس مینویسیم :

<h1> Pages </h1>
<% if @pages.any? %>
<p>
<%  @pages.each do |page| %>
<h1><%= page.title %> </h1>
<p> <%= page.text %> </p>
<% end %>
</p>
<% else %>
<h1> No pages added! </h1>
<% end %>

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

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

 

فرمورک Sinatra یک میکروفرمورک وب است که اکثر کاربران و توسعه دهندگان روبی، با آن آشنایی دارند. برای شروع و ساخت پروژه هایی که زمان زیادی برایشان نداریم، بدون شک این فرمورک یکی از بهترین انتخاب هاست. در اکثر مثالهایی که در اینترنت موجود است، به گفتن متد get بسنده کرده اند. در حالی متد POST هم متد مهمی در فرمورک های وب به شمار می آید. در این آموزش، استفاده از متد post را بررسی میکنیم.

قدم های اولیه

ابتدا یک پوشه به اسم post-app ایجاد کرده، درون این پوشه پوشه دیگری با نام views ایجاد کنید. سپس در همان پوشه post-app فایل app.rb را نیز ایجاد نمایید. در واقع، این ها قدم های اولیه ما برای نوشتن یک برنامه در سیناتراست. درون پوشه views یک فایل با نام form.erb ایجاد کرده، آن را باز کنید و درونش این محتوا را کپی کنید :

<h3>Simple Form</h3>
<form action="/form" method="post">
  <input type="text" name="content">
  <input type="submit">
</form>

سپس به app.rb رفته، آن را باز کرده و این محتوا را درونش قرار دهید :

require 'sinatra'
 
get '/' do
 erb :form
end

اکنون چنانچه برنامه را اجرا کنید، متوجه خواهید شد که هرچه درون فرم بنویسید، طبیعتا باید به یکجا ارسال شود. اما کجا؟ اینجاست که ما متد POST را نیاز داریم.

اضافه کردن post به کد

همانطور که در کد form.erb مشاهده کردید، ما در قسمت action از آدرس form استفاده نمودیم و همچنین نام محتوای داخل فرم را content گذاشتیم. اکنون فایلی به نام content.erb در views ایجاد کرده، آن را باز کنید و محتوای درونش را به این شکل تغییر دهید :

<h2> You Said </h2> 
<h3> <%= params[:content] %> </h3>

سپس به فایل app.rb برگشته و این خطوط را به آن اضافه نمایید :

post '/form' do
 erb :content
end

و اکنون با اجرای برنامه، هرچه درون فرم طراحی شده بنویسید را در آدرس form مشاهده میکنید. با استفاده از متد post میتوانید اطلاعات را درون یک دیتابیس بنویسید و بیشتر استفاده آن نیز در این موارد است.

موفق باشید.

این روزها، در کمتر گروهی است که شاهد حضور یک یا دو بات نباشیم. همچنین، اکثر افراد علاقمند، بسته به سلیقه ها و علاقه هایشان، بات های تلگرام مختلفی را نوشته اند. برای مثال، شخصی باتی نوشته که با دادن پیغام خاصی، شخصی را به گروه اضافه، و یا از گروه حذف میکند، یا بات های دیگری که صرفا برای اسپم کردن در گروه ها، جست و جو در ویکیپدیا  و … نوشته شده اند. برای ساخت یک بات تلگرام، شما نیاز دارید تا توسط اکانت BotFather روبات خود را تعریف کنید. سپس با خواندن مستندات API بات ها، روبات (های) خود را کامل کنید. اما این متد ها و API کد ها، به خودی خود هیچ کاری انجام نمیدهند. بلکه شما هستید که با کدی که برای روبات خود مینویسید، میگویید که چه کند. در این آموزش، ساخت یک روبات کوچک که به دو دستور start و img واکنش نشان میدهد را خواهید آموخت.

نصب جم های مورد نیاز

خوشبختانه برای هر منظوری در روبی، حداقل یک جم وجود دارد. شما میتوانید به صورت مستقیم با تایپ دستور :

gem install telegram-bot-ruby

این جم را نصب کنید و یا یک Gemfile بسازید و بعد محتوای آن را چنین وارد کنید :

source 'https://rubygems.org'
gem 'telegram-bot-ruby'

جهت اطلاعات بیشتر در مورد کار با Bundler ، میتوانید مقاله قبلی همین وبسایت را مطالعه کنید.

شروع به نوشتن روبات

اکنون، جم مورد نیاز ما نصب شده است، روبات خود را با استفاده از BotFather ایجاد کرده ایم، و نوبتی هم باشد نوبت نوشتن کد برای روبات است. یک فایل به نام bot.rb ایجاد میکنیم (توجه کنید که اسم فایل اختیاری است)، و سپس جم مورد نظر را فراخوانی میکنیم. همچنین API خود را درون متغیری به اسم token قرار میدهیم :

require 'telegram/bot'
 
token = 'YOUR API CODE HERE'

سپس، باید دستوری بدهیم که آغاز بات ما باشد :

Telegram::Bot::Client.run(token) do |bot|
end

همانگونه که می بینید، دستور نسبتا طولانی را در متغیری به نام bot خلاصه کردیم. اکنون نوبت آن است که روبات ما، شروع کند به شنیدن آن چه توسط privacy تنظیم کرده ایم (به صورت پیشفرض، روبات ها صرفا به پیام هایی دسترسی دارند که با / شروع می شوند). کل برنامه ما به این شکل خواهد بود:

require 'telegram/bot'
 
token = 'YOUR_TELEGRAM_BOT_API_TOKEN'
 
Telegram::Bot::Client.run(token) do |bot|
  bot.listen do |message|
  end
end

اکنون میخواهیم بررسی کنیم که از کدام متد ها برای روبات خود استفاده کنیم. همانگونه که در ابتدای مطلب گفته شد، قرار است دو دستور start و img دریافت گردد، و سپس واکنشی نشان داده شود. دستور start میخواهد به کاربر سلام دهد، و دستور img یک عکس برای کاربر بفرستد. پس کد برنامه به این شکل خواهد بود :

require 'telegram/bot'
 
token = 'YOUR_TELEGRAM_BOT_API_TOKEN'
 
Telegram::Bot::Client.run(token) do |bot|
  bot.listen do |message|
   case message.text
    when '/start'
     bot.api.sendMessage(chat_id: message.chat.id, text: "Hello, @#{message.from.username}")
    when '/img'
     bot.api.sendPhoto(chat_id: message.chat.id, photo: File.new('./image.jpg')
     end
  end
end

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

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

require 'sinatra'
require 'highline/import'
require 'json/ext'

 

و در فایل راهنما، به کاربر برنامه می گوییم تا جم مورد نیاز را توسط دستور gem نصب نماید. اما، چرا جم ها را مستقل از کل سیستم روبی نصب نکنیم؟ تا فقط در دایرکتوری برنامه خودمان معتبر باشند، و کاربر دستورات کمتری را برای نصب جم های مورد نیاز وارد کند. برای این کار، از bundler استفاده میکنیم. (توجه کنید که هم دستور bundle و هم دستور bundler در واقع یکی هستند). برای این که از Bundle استفاده کنیم، نیاز داریم تا یک فایل به اسم Gemfile ایجاد کنیم. سپس درون جم فایل، باید این اطلاعات را وارد نماییم :

  1. سروری که جم ها روی آن قرار دارند
  2. نام جم ها
  3. نسخه مورد نظر جم های مورد نیاز

برای تعریف سرور، کافیست به این شکل عمل کنیم :

source 'https://rubygems.org'

 

به این شکل، Bundler میفهمد که ما از وبسایت rubygems بعنوان منبع جم ها باید استفاده کند. اکنون نیاز است تا جم های مورد نیاز را به Gemfile خود بدهیم. با فرض این که جم های سیناترا را نیاز داریم، در جم فایل چنین مینویسیم :

gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt'
gem 'mongo'

 

خب، اکنون با اجرای دستور :

bundle install

جمهای مورد نیاز، در دایرکتوری برنامه ما نصب می شوند. اما هنوز یک مشکل داریم، برای مثال sinatra-assetpack ، با نسخه های ۲ به بعد tilt مشکل دارد، پس با این حساب باید نسخه این جم را پایین آوریم، پس در جم فایل این چنین تغییر ایجاد میکنیم :

gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt', '1.4.1'
gem 'mongo'

با این کار، Bundler میفهمد که نسخه ۱.۴.۱ از جم tilt را باید نصب کند. اما اگر ندانید آخرین نسخه پایدار tilt چیست چطور؟  باید به شکل زیر عمل کنید :

gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt', '< 2.0'
gem 'mongo'

به این شکل، bundler آخرین نسخه پایدار قبل از ۲.۰ را برای ما نصب میکند. در نهایت، جم فایل ما به این شکل در می آید :

source 'https://rubygems.org'
 
gem 'sinatra'
gem 'sinatra-assetpack'
gem 'tilt', '<2.0'
gem 'mongo'

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

در قسمت قبلی، تا حلقه های تکرار پیش رفتیم، در این پست، قصد داریم تا توابع در زبان کافی اسکریپت را یاد بگیریم. همانطور که ابتدای آموزش گفته شد، کافی اسکریپت سینتکس کاملا مشابه روبی دارد، اما روبی نیست. مصداق کامل این تفاوت، در نوع پیاده سازی توابع این زبان مشخص میگردد. تعریف تابع، نیازی به بازگویی ندارد، چرا که اگر کمی با ریاضیات آشنا باشید تعریف و مفهوم تابع را میدانید. تابع ها در برنامه نویسی چند نوعند، توابع خالی (void) ، تابع با آرگومان و تابع بازگشتی (recursive).

در ابتدا، با یک مثال از تابع void ، با ساختار کلی تابع در کافی اسکریپت آشنا می شویم. تابع زیر صرفا دستور alert را فراخوانده و یک پیام را نشان میدهد :

func = () -> alert "Hello, World!"
 
func()

معادل این کد در جاوااسکریپت این چنین است :

var func;
 
func = function() {
  return alert("Hello, World!");
};
 
func();

کاربرد توابع void را در آموزش مربوط به کلاسها و شیء گرایی خواهیم دید.

توابع آرگومان دار، یک یا دو آرگومان به عنوان ورودی دریافت کرده و سپس روی آنها عملیات خاصی انجام میدهند. مثلا تابع زیر، عدد ورودی را به توان دو می رساند :

square = (x) -> x ** 2

و معادل همین کد در جاوااسکریپت چنین است :

var square;
 
square = function(x) {
  return Math.pow(x, 2);
};

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

gcd = (x, y) ->
      while y != 0
         remainder = x % y
         x = y
         y = remainder
      return x

معادل این تابع در جاوااسکریپت :

var gcd;
 
gcd = function(x, y) {
  var remainder;
  while (y !== 0) {
    remainder = x % y;
    x = y;
    y = remainder;
  }
  return x;
};

اینجا مجبور شدیم تا کلمه کلیدی return را مستقیما به کار ببریم. پیاده سازی توابع در کافی‌اسکریپت، بسیار ساده است. اکنون به مهم ترین بخش قضیه، یعنی توابع بازگشتی میرسیم. تابع بازگشتی، تابعی است که نتیجه جمله n ام آن به جمله n-1 ام وابسته باشد. نمونه خوب و کاربردی تابع بازگشتی هم تابع فاکتوریل است.

factorial = (x) -> 
          if x == 0
             return 1
          else
             return x * factorial(x-1)

همانگونه که دیدید، در این تابع، ابتدا چک می شود که ورودی صفر است یا نه. اگر بود، مقدار ۱ بر میگرداند، اگر نبود آنقدر از مقدار عدد کم میکند تا به صفر برسد و سپس نتیجه را در فاکتوریل صفر، یعنی ۱ ضرب کند و نتیجه را نمایش دهد.

معادل این کد در جاوااسکریپت :

var factorial;
 
factorial = function(x) {
  if (x === 0) {
    return 1;
  } else {
    return x * factorial(x - 1);
  }
};

بحث توابع، بحث جدی و بسیار مهمی در هر زبان برنامه نویسی است. در اینجا سعی شد تا به بهترین شکل، توابع بیان شوند. این بحث، آخرین بحث از سری مقالات «شروع به کار با کافی اسکریپت» بود و انشاء الله در آینده ای نزدیک، مباحث شی گرایی را آغاز خواهیم کرد.

موفق باشید.

در آموزش های پیش، پیشرفت خوبی در یادگیری این زبان برنامه نویسی، داشته ایم. اکنون میخواهیم یکی از مهم ترین بحث ها (و در اکثر مواقع کار راه انداز ترین) یعنی حلقه های تکرار را بررسی کنیم. همچون سایر بخش های این زبان، این بخش هم کاملا از روبی گرفته شده است. در کافی اسکریپت، دو حلقه while و for داریم، که دقیقا عملکرد مشابه همین حلقه ها در روبی را دارند.

حلقه while

این حلقه، ساختار بسیار ساده ای دارد. در واقع، تمام عملیات این حلقه در بدنه انجام می شود و تنها یک شرط لازم دارد. ساختار کلی حلقه while در کافی اسکریپت به این شکل است :

n = 0
sum = 0
while n <= 10
  sum += n
  n += 1
  alert sum

همانطور که مشاهده میکنید، این حلقه یک شرط درست دریافت کرده، و تا زمانی که شرط درست باشد اجرا میشود و متغیر sum را با n جمع میزند. معادل این کد در جاوااسکریپت به این شکل است :

var n, sum;
 
n = 0;
 
sum = 0;
 
while (n <= 10) {
  sum += n;
  n += 1;
  alert(sum);
}

میتوان قطعه کد های پیشرفته تری نیز با while نوشت، یا درون برنامه های دیگر از آن استفاده کرد. برای مثال، برنامه زیر اعضای یک آرایه را به صورت پیام نشان میدهد :

a = [1, 2, 3, 4, 5]
n = 0 
 
while n < a.length
    alert a[n]
    n += 1

عملکرد کد فوق به این شکل است که تا زمانی که n از طول a کوچکتر است، اعضای a را چاپ میکند. معادل کد فوق در جاوااسکریپت به این شکل است :

var a, n;
 
a = [1, 2, 3, 4, 5];
 
n = 0;
 
while (n < a.length) {
  alert(a[n]);
  n += 1;
}

اکنون، با حلقه while آشنا شده اید. یادتان باشد دستورات منطقی مانند true و false هم میتوانند شرایط حلقه while باشند، که در صورت true بودن (یا همیشه راستگو بودن)، حلقه بی نهایت است و چنانچه false (یا همیشه دروغگو) باشد، حلقه اصلا اجرا نمی گردد.

پس از این که با حلقه while آشنا شدیم، نوبت میرسد به حلقه for.

حلقه for

ساختار for در کافی اسکریپت از روبی اقتباس شده است، اما حقیقتا کافی اسکریپت، این ساختار را بهتر پیاده سازی کرده است. بعنوان مثال، این قطعه کد را در نظر بگیرید :

a = [1, 2, 3, 4, 5]
 
alert b for b in a

عملکرد این قطعه کد به این شکل است که :

۱. اول تابعی که فراخوانی شده، متغیر را بعنوان آرگومان دریافت میکند.

۲. آن را به یکایک اعضای آرایه مقابلش نسبت میدهد.

۳. تابع را اجرا میکند.

در واقع عملکرد بسیار ساده ای دارد، که در جاوااسکریپت کد به این شکل نوشته می شود :

var a, b, i, len;
 
a = [1, 2, 3, 4, 5];
 
for (i = 0, len = a.length; i < len; i++) {
  b = a[i];
  alert(b);
}

در واقع ساختار حلقه for در زبان های روبی و کافی اسکریپت، همان foreach است.

تا اینجا، با بنیان و اساس برنامه نویسی در کافی اسکریپت آشنا شدیم. در آموزش های بعدی، سراغ مفاهیم پیشرفته تر این زبان خواهیم رفت .

پس از این که بیسیک های کافی اسکریپت را فرا گرفتیم، اکنون نوبت آن است که به سراغ ساختارهای کنترلی و دستورات شرطی در این زبان برویم. همانطور که قبل تر نیز گفته بودیم، کافی اسکریپت پیاده سازی جاوااسکریپت با سینتکس روبی است. پس اگر با ساختار کنترلی در روبی آشنا باشید، اینجا کار بسیار ساده می شود.

یکی از مهم ترین بخش های برنامه نویسی، اینست که برنامه شما کنترل شده باشد. در واقع، ورودی ها و خروجی های مناسب را دریافت کنید و در صورتی که مطلوب نبودند، آنها را نادیده بگیرید یا در بهترین حالت، اروری به کاربر نشان دهید. اینجا سه ساختار اصلی if و if…else و if…else if…else را بررسی میکنیم. همچنین ساختار switch را.

سه ساختار if و else

ساختار if

از این ساختار، فقط برای کنترل یک شرط (که خود میتواند ترکیبی از چند شرط باشد) ، استفاده میکنیم. مثلا، ساده ترین شرط ممکن این است که بررسی کنیم آیا متغیر، مساوی مقداری هست یا نه. سپس اگر بود، برای ما یک پیغام نشان دهد.  کد ما به این شکل خواهد بود :

if a == 3
   alert a + " is equal to 3"

و معادل این کد در جاوا اسکریپت :

a = 3;
 
if (a === 3) {
  alert(a + " is equal to 3");
}

در این ساختار، شما نمیتوانید تعریف کنید که اگر مقدار a برابر ۵ گردد، چه اتفاقی بیفتد.

ساختار if … else

در این ساختار، اگر شرط مقابل if ، به هر دلیلی (ورودی کاربر، تغییر در متغیر توسط برنامه نویس و …) false شود، عملیات دیگری انجام میدهد. ساختار کلی در کافی‌اسکریپت به این شکل است :

a = 5
if a == 3
   alert a + " is equal to 3"
else 
   alert a + " is not equal to 3"

و معادل کد فوق در جاوااسکریپت :

a = 5;
 
if (a === 3) {
  alert(a + " is equal to 3");
} else {
  alert(a + " is not equal to 3");
}

این کد، میگوید اگر شرط if درست نبود، چه کار کن. حالا میخواهیم شرط غلط را رد کند، و شرط جدیدی اجرا کند. کافیست از ساختار بعدی استفاده کنیم.

ساختار if … else if … else

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

a = 1
 
if a == 2
  alert a + " is 2"
else if a >= 2
   alert a+" is greater than 2"
else
   alert a + " is lesser than 2"

معادل این کد در جاوااسکریپت :

a = 1;
 
if (a === 2) {
  alert(a + " is 2");
} else if (a >= 2) {
  alert(a + " is greater than 2");
} else {
  alert(a + " is lesser than 2");
}

این ساختار نیز یکی از ساختار های پر کاربرد است.

ساختار switch

اگر با زبان های C و ++C و … کار کرده باشید نیز با این ساختار آشنایید. این ساختار هم برای مواقعی کاربرد دارد که بیش از یک شرط داریم، و به نوعی جایگزینی برای else if به شمار میرود.

ساختار کلی این دستور در کافی اسکریپت بدین شکل است :

a = 2
 
switch a 
   when 1 then alert a + " is lesser than 2"
   when 2 then alert a + " is 2"
   when 3 then alert a + " is greater than 2"
   else
     alert "None of them"

معادل کد در جاوااسکریپت :

a = 2;
 
switch (a) {
  case 1:
    alert(a + " is lesser than 2");
    break;
  case 2:
    alert(a + " is 2");
    break;
  case 3:
    alert(a + " is greater than 2");
    break;
  default:
    alert("None of them");
}

 

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