اگر با زبانهایی مانند جاوا یا Node.js آشنایی دارید، در این صورت احتمالاً با مفهوم پکیجها کاملاً آشنا هستید. پکیج چیزی به جز یک دایرکتوری با تعدادی فایلهای کد نیست که هر کدام متغیرها (قابلیتهای) مختلفی را از یک نقطه مرجع واحد عرضه میکنند. در ادامه به توضیح مفاهیم مرتبط با پکیج های Go میپردازیم.
تصور کنید بیش از هزار تابع دارید که در زمان کار روی هر پروژهای به طور مداوم به آنها نیاز پیدا میکنید. برخی از این تابعها رفتار مشترکی دارند. برای نمونه تابع toUpperCase و toLowerCase حالت حروف یک رشته را تغییر میدهند، بنابراین آنها را در یک فایل منفرد مثلاً با نام case.go مینویسید. تابعهای دیگری نیز وجود دارند که عملیات دیگری روی نوع داده String اجرا میکنند از این رو آنها را نیز در فایل جداگانهای مینویسید.
از آنجا که فایلهای مختلفی دارید که با نوع داده String کار میکنند، باید یک دایرکتوری به نام string بسازید و همه فایلهای مرتبط با string را درون آن قرار دهید. در نهایت همه این دایرکتوریها را در یک دایرکتوری والد قرار دهید که پکیج شما را تشکیل میدهند. بدین ترتیب کل ساختار پکیج به صورت زیر درمیآید:
در ادامه به طور کامل روش ایمپورت کردن تابعها و متغیرها از پکیج و این که چطور همه چیز با هم درمیآمیزد تا یک پکیج تشکیل یابد توضیح خواهیم داد. اما در حال حاضر، تصور کنید پکیج شما به صورت یک دایرکتوری شامل فایلهای go. است.
هر برنامه Go باید بخشی از یک پکیج باشد. یک برنامه منفرد اجرایی Go باید اعلان package main را داشته باشد. اگر برنامه بخشی از پکیج main باشد، در این صورت go install یک فایل باینری میسازد که در زمان اجرا تابع main برنامه را فراخوانی میکند. اگر برنامه بخشی از چیزی به جز main باشد در این صورت با اجرای دستور go install یک فایل package archive ایجاد میشود. اگر از این توضیحات سردرگم شدهاید جای نگرانی نیست، چون در ادامه همه آنها را به تفصیل توضیح خواهیم داد.
در ادامه یک پکیج اجرایی ایجاد میکنیم. چنان که میدانیم برای ایجاد یک فایل اجرایی باینری برنامه ما باید بخشی از پکیج main باشد و یک تابع main داشته باشد که نقطه ورودی اجرای برنامه است.
نام یک پکیج همان نام دایرکتوری شامل آن است که در دایرکتوری src قرار دارد. در حالت فوق، app نام پکیج است زیرا app دایرکتوری فرزند دایرکتوری src است. چرا که دستور go install app در زیردایرکتوری app درون src مسیر GOPATH به دنبال فایل میگردد. سپس پکیج را کامپایل میکند و فایل اجرایی باینری app را درون دایرکتوری bin کامپایل میکند. این فایل باید از ترمینال قابل اجرا باشد، زیرا دایرکتوری bin در PATH قرار دارد.
اعلان پکیج باید نخستین خط در کد پکیج باشد و در مثال فوق به صورت package main دیده میشود و میتواند از نام پکیج متفاوت باشد. از این رو ممکن است پکیجهایی را مشاهده کنید که نام پکیج (نام دایرکتوری) از اعلان پکیج متفاوت باشد. زمانی که یک پکیج را ایمپورت میکنید، اعلان پکیج برای ساخت متغیر ارجاع پکیج استفاده میشود. در ادامه این موضوع را بیشتر توضیح خواهیم داد.
دستور <go install <package به دنبال هر فایلی میگردد که اعلان پکیج main را درون دایرکتوری package مفروض داشته باشد. اگر فایل را پیدا کند، در این صورت Go میفهمد که یک برنامه اجرایی است و باید فایل باینری آن را ایجاد کند. یک پکیج میتواند فایلهای زیادی داشته باشد، اما فقط یک فایل دارای تابع main است زیرا آن فایل نقطه ورودی اجرای برنامه خواهد بود.
اگر پکیجی شامل فایلی با اعلان پکیج main نباشد، در این صورت Go یک فایل آرشیو پکیج (با پسوند a.) درون دایرکتوری pkg میسازد.
از آنجا که app یک پکیج اجرایی نیست، یک فایل app.a درون دایرکتوری pkg ایجاد کرده است. ما نمیتوانیم این فایل را اجرا کنیم زیرا یک فایل باینری نیست.
جامعه Go پیشنهاد میکند که از نامهای ساده و سرراست برای پکیجها استفاده کنید. برای نمونه strutils برای تابعهای string utility و یا http برای تابعهای مرتبط با درخواستهای HTTP مناسب هستند. نامگذاری پکیجها به صورت under_scores ،hy-phens یا mixedCaps توصیه نمیشوند.
چنان که پیشتر توضیح دادیم، دو نوع پکیج وجود دارند. یک پکیج اجرایی و یک پکیج کاربردی (utility). پکیج اجرایی اپلیکیشن اصلی شما است چون آن را اجرا خواهید کرد. پکیج کاربردی به تنهایی نمیتواند اجرا شود، بلکه کارکردهای یک پکیج اجرایی را از طریق ارائه تابعهای کاربری و دیگر موارد مهم بهبود میبخشد.
چنان که میدانیم پکیج چیزی به جز یک دایرکتوری نیست. بنابراین در ادامه ابتدا یک دایرکتوری به نام greet درون دایرکتوری src میسازیم و چند فایل در آن ایجاد میکنیم. این بار یک اعلان package greet در ابتدای فایل مینویسیم تا بیان کنیم که این یک پکیج کاربردی است.
یک پکیج کاربردی برای ارائه برخی متغیرهای به پکیجی که آن را ایمپورت کند طراحی شده است. این وضعیت شبیه به ساختار export در جاوا اسکریپت است. Go در صورتی یک متغیر را اکسپورت میکند که نام متغیر با حروف بزرگ آغاز شده باشد. همه متغیرهای دیگر که با حروف کوچک آغاز میشوند در پکیج به صورت خصوصی تعریف شدهاند.
از اینجا به بعد در این مقاله ما قصد داریم از کلمه variable برای توصیف اکسپورت یک عضو استفاده کنیم، اما توجه داشته باشید که اکسپورت اعضا میتوانند از هر نوع مانند constant ،map ،function ،struct ،array ،slice و غیره باشند.
در ادامه یک متغیر را از فایل day.go اکسپورت میکنیم.
در برنامه فوق متغیر Morning از پکیج اکسپورت میشود، اما متغیر morning اکسپورت نمیشود زیرا با حرف کوچک آغاز شده است.
اکنون به یک پکیج اجرایی نیاز داریم که پکیج greet ما را مصرف کند. در ادامه یک دایرکتوری app درون دایرکتوری src میسازیم و فایل entry.go را با اعلان پکیج main و تابع main ایجاد میکنیم. توجه داشته باشید که در این حالت پکیجهای Go یک سیستم نامگذاری فایل مدخل مانند index.js در Node ندارند. برای هر پکیج اجرایی یک فایل با تابع main به عنوان فایل مدخل برای اجرا استفاده میشود.
برای ایمپورت کردن یک پکیج از ساختار import به همراه نام پکیج استفاده میکنیم.
برخلاف دیگر زبانهای برنامهنویسی نام یک پکیج باید مسیر زیرمجموعه مانند some-dir/greet باشد تا Go به طور خودکار مسیر را به پکیج greet بیابد. این موضوع را در بخش پکیجهای تودرتو در ادامه بیشتر توضیح خواهیم داد.
Go ابتدا در دایرکتوریهای درون دایرکتوری GOROOT/src جستجو میکند و اگر پکیج را پیدا نکند در این صورت به دنبال GOPATH/src میگردد. از آنجا که پکیج fmt بخشی از کتابخانه استاندارد Go است که در GOROOT/src قرار دارد، از آنجا ایمپورت میشود. از آنجا که Go نمیتواند پکیج greet را درون GOROOT بیابد، درون GOPATH/src را میگردد و آنجا آن را مییابد.
برنامه فوق یک خطای کامپایل صادر میکند، چون متغیر morning از پکیج greet قابل مشاهده نیست. چنان که مشاهده میکنید ما از نمادگذاری نقطهای برای دسترسی به اعضای اکسپورت شده یک پکیج استفاده کردهایم. زمانی که یک پکیج را ایمپورت میکنید، Go یک متغیر سراسری با استفاده از اعلان پکیج ایجاد میکند. در حالت فوق، greet یک متغیر سراسری است که از سوی Go ایجاد شده است، زیرا ما از اعلان package greet در برنامههای که در پکیج greet گنجانده شدهاند استفاده کردهایم.
ما میتوانیم پکیجهای fmt و greet را با هم با استفاده از ساختار گروهبندی (پرانتزها) ایمپورت کنیم. این بار برنامه ما به درستی کامپایل میشود زیرا متغیر Morning از خارج پکیج قابل دسترسی است.
ما میتوانیم یک پکیج را درون پکیج دیگر به صوت تودرتو تعریف کنیم. از آنجا که در Go هر پکیج صرفاً یک دایرکتوری است این کار مانند ایجاد یک دایرکتوری فرعی درون یک پکیج از قبل موجود است. تنها کاری که باید انجام دهیم ارائه یک مسیر نسبی از پکیجهای تو در تو است.
چنان که پیشتر توضیح دادیم، دستور go run یک برنامه را کامپایل کرده و اجرا میکند. ما میدانیم که دستور go install پکیجها را کامپایل میکند و فایلهای اجرایی باینری یا فایلهای آرشیو پکیج را میسازد. این کار به منظور اجتناب از کامپایل تکراری پکیجها اجرا میشود. دستور go install یک پکیج را از قبل کامپایل میکند و Go به فایلهای a. اشاره میکند.
به طور کلی زمانی که یک پکیج شخص ثالث را نصب میکنید Go پکیج را کامپایل میکند و فایل آرشیو پکیج را میسازد. اگر پکیج را به صوت محلی نوشته باشید، در این صورت IDE ممکن است آرشیو پکیج را به محض این که فایل را در پکیج ذخیره کردید یا هنگامی که پکیج تغییر یافت ذخیره کند. در صورتی که افزونه Go را روی VSCode نصب کرده باشید، پکیج را زمانی کامپایل میکند که آن را ذخیره کنید.
زمانی که یک برنامه Go را اجرا میکنید، کامپایلر Go از ترتیب اجرایی خاصی برای پکیجها، فایلها در پکیج و اعلان متغیر در پکیج پیروی میکند.
دامنه به منطقه خاصی از بلوک کد گفته میشود که یک متغیر تعریف شده در آن قابل دسترسی است. دامنه یک پکیج منطقهای درون آن پکیج است که یک متغیر از درون پکیج قابل دسترسی باشد. این منطقه بالاترین سطح بلوک هر فایلی در پکیج است.
نگاهی به دستور go run بیندازید. این بار به جای اجرای یک فایل، یک الگوی سراسری داریم که شامل همه فایلهای درون پکیج app میشود که باید اجرا شوند. Go به قدر کافی هوشمند است تا یک نقطه ورودی برای اپلیکیشن به صورت entry.go تشخیص دهد، زیرا تابع main را دارد. ما میتوانیم از یک دستور مانند زیر نیز استفاده کنیم (ترتیب نام فایل اهمیتی ندارد):
go run src/app/version.go src/app/entry.go
دستورهای go install یا go build به یک نام پکیج نیاز دارند که شامل همه فایلهای درون یک پکیج است و از این رو لازم نیست آنها را به صورت فوق مورد اشاره قرار دهیم.
اگر به موضوع اصلی خود بازگردیم، میتوانیم از متغیر version که در فایل version.go اعلان شده است در هر جای پکیج استفاده کنیم گرچه اکسپورت نشده است، زیرا در دامنه پکیج اعلان شده است. اگر متغیر باشد در یک تابع اعلان شده باشد، در دامنه پکیج نخواهد بود و برنامه فوق در زمان کامپایل با خطا مواجه میشود.
شما مجاز به اعلان مجدد متغیر سراسری با همان نام در همان پکیج نیستید. از این رو زمانی که متغیر version اعلان میشود دیگر نمیتوان آن را در دامنه پکیج مجدداً اعلان کرد. اما میتوان آن را در جای دیگر مجدداً اعلان کرد.
زمانی که یک متغیر مانند a به متغیر دیگری مانند b وابسته باشد، متغیر b باید پیش از آن تعریف شده باشد، در غیر این صورت برنامه کامپایل نمیشود. Go از این قاعده درون تابعها استفاده میکند.
اما زمانی که این متغیرها در دامنه پکیج استفاده شوند، میتوان آنها را در چرخههای مقداردهی اولیه اعلان کرد. به مثال ساده زیر توجه کنید.
در مثال فوق، ابتدا c اعلان شده است، زیرا مقدار آن قبلاً اعلان شده است. در چرخه بعدی مقداردهی b اعلان میشود، زیرا به c وابسته است و مقدار c قبلاً اعلان شده است. در چرخه نهایی مقداردهی a اعلان شده است و مقدار b به آن انتساب یافته است. Go میتواند چرخههای مقداردهی پیچیدهای مانند وضعیت زیر را مدیریت کند.
در مثال فوق، ابتدا c اعلان شده است و سپس b اعلان میشود، زیرا مقدار آن وابسته به c است و در نهایت a اعلان میشود، چون مقدار آن به b بستگی دارد. شما باید از هر حلقه مقداردهی مانند زیر که مقداردهی اولیه وارد حلقه بازگشتی میشود اجتناب کنید:
مثال دیگری از دامنه پکیج مانند زیر حالتی است که تابع f در یک فایل جداگانهای باشد که به متغیر c از فایل اصلی ارجاع داده باشد.
تابع init نیز مانند تابع main از سوی Go زمانی که پکیج مقداردهی اولیه میشود فراخوانی خواهد شد. این تابع هیچ آرگومانی نمیگیرد و هیچ مقداری بازنمیگرداند. تابع init به صورت صریح از سوی Go اعلان شده است، چون نمیتوانید از جای دیگری به آن ارجاع دهید و یا آن را به صورت ()init فراخوانی کنید. شما میتوانید چندین تابع init در یک فایل یا پکیج داشته باشید. ترتیب اجرای تابع init در یک فایل بر اساس ترتیب نمایش آنها خواهد بود.
شما میتوانید تابع init را در هر جای پکیج خود داشته باشید. این تابعهای init به ترتیب الفبایی فراخوانی میشوند.
پس از آن که همه تابعهای init اجرا شدند، تابع main فراخوانی میشود. زیرا وظیفه اصلی تابع init مقداردهی اولیه متغیرهای سراسری است که در چارچوب سراسری قابل مقداردهی نیستند. برای نمونه یک آرایه را مقداردهی اولیه میکند.
از آنجا که ساختار for در دامنه پکیج Go معتبر نیست، میتوانیم آرایه integers با اندازه 10 را با استفاده از حلقه for درون تابع init مقداردهی اولیه کنیم.
زمانی که یک پکیج را ایمپورت میکنید، Go یک متغیر با استفاده از اعلانهای پکیج ایجاد میکنید. اگر چندین پکیج را با نام یکسان ایمپورت کنید، منجر به بروز تداخل میشود.
از این رو از «اسامی مستعار پکیج» (package alias) استفاده میکنیم. بین کلیدواژه inport و نام پکیج یک متغیر میآوریم که آن را به یک متغیر جدید برای ارجاع به پکیج تبدیل میکند.
در مثال فوق، پکیج greet/greet از سوی متغیر child مورد ارجاع قرار میگیرد. شاید متوجه شده باشید که ما پکیج greet را با کاراکتر زیرخط به صورت یک نام مستعار اعلان کردیم. زیرخط، یک کاراکتر خاص در Go است که به عنوان کانتینر null عمل میکند. از آنجا که ما در حال ایمپورت کردن پکیج greet هستیم، اما از آن استفاده نمیکنیم، کامپایلر Go از این موضوع شکایت میکند. برای اجتناب از این وضعیت، ما یک ارجاع به آن پکیج با استفاده از _ حفظ میکنیم و بدین ترتیب کامپایلر Go آن را نادیده میگیرد.
تعریف نام مستعار برای یک پکیج با یک زیرخط که به ظاهر هیچ کاری انجام نمیدهد، در برخی موارد زمانی که میخواهید یک پکیج را مقداردهی اولیه کنید؛ اما از آن استفاده نکنید، کاملاً مفید خواهد بود.
تا به اینجا، همه مسائلی که مرتبط با پکیجها بود را توضیح دادیم. اینک نوبت آن رسیده است که درک خود در مورد شیوه مقداردهی اولیه برنامهها در Go را جمعبندی کنیم.
در ادامه مثالی کوچک را ملاحظه میکنید:
نصب پکیجهای شخص ثالث چیزی به جز کلون کردن کد ریموت درون یک دایرکتوری محلی به صورت <src/<package نیست. متأسفانه Go از نسخهبندی پکیجها پشتیبانی نمیکند و روشی نیز برای مدیریت پکیجها ارائه نکرده است.
از آنجا که Go یک رجیستری مرکزی رسمی برای پکیجها ندارد از شما میخواهد که نام میزبان و مسیر پکیج را مورد اشاره قرار دهید.
go get -u github.com/jinzhu/gorm
دستور فوق فایلهایی را از URL به نام http://github.com/jinzhu/gorm ایمپورت میکند و آنها را در دایرکتوری ذخیره میکند. چنان که در بخش پکیجهای تودرتو بررسی کردیم، میتوان پکیج gorm را مانند زیر ایمپورت کرد:
package main import "github.com/jinzhu/gorm" // use ==> gorm.SomeExportedMember
بنابراین اگر یک پکیج ساختید و خواستید افراد از آن استفاده کنند کافی است آن را روی گیتهاب منتشر کنید. اگر پکیج شما اجرایی است، افراد میتوانند از آن به عنوان یک ابزار خط فرمان استفاده کنند، در غیر این صورت باید آن را در برنامه خود ایمپورت کنند و از آن به عنوان یک ماژول کاربردی استفاده کنند. در این حالت تنها کاری که باید انجام دهید اجرای دستور زیر است:
go get github.com/your-username/repo-name
تابعهای Overload شده به توابعی گفته میشود که نامی یکسان اما آرگومان(های) متفاوتی دارند. در این مقاله به بررسی نمونههایی از تابعهای Overload شده میپردازیم. برای مطالعه بخش قبلی این مجموعه مقالات آموزشی به لینک زیر مراجعه کنید:
چنان که در بخشهای قبلی صحبت کردیم تابع به معنی قطعه کدی است که به گروهبندی کد میپردازد و وظیفه خاصی را اجرا میکند. در برنامهنویسی ++C دو تابع به شرط این که تعداد و/یا نوع آرگومانهایی که ارسال میشوند متفاوت باشند، میتوانند نام یکسانی داشته باشند.
در تابعهای زیر نوع یا تعداد (و یا هر دوی) پارامترها متفاوت هستند و لذا به نام تابعهای overload شده شناخته میشوند:
در قطعه کد فوق 4 تابع به صورت تابعهای overload شده هستند، زیرا آرگومان(های) ارسالی به این تابعها متفاوت هستند. توجه داشته باشید که نوع بازگشتی هر 4 تابع یکسان هستند. تابعهای overload شده ممکن است نوع بازگشتی متفاوتی داشته باشند یا نداشته باشند، اما حتماً باید آرگومانهای متفاوتی داشته باشند.
تعداد و نوع آرگومانهای ارسالی به این دو تابع حتی با این که نوع بازگشتی متفاوت است، یکسان هستند. از این رو کامپایلر خطایی ایجاد میکند.
overload کردن تابع:
Integer number: 5 Float number: 5.5 Integer number: 5 and float number: 5.5
در کد فوق، تابع ()display سه بار با انواع یا تعداد متفاوتی از آرگومانها فراخوانی میشود. نوع بازگشتی همه این تابعها یکسان است، اما الزامی برای این مسئله وجود ندارد.
overload کردن تابع:
Absolute value of -5 = 5 Absolute value of 5.5 = 5.5
در مثال فوق، دو تابع ()absolute به صورت overload شده هستند. هر دو تابع آرگومان منفردی میگیرند. با این حال، یک تابع مقدار integer به عنوان آرگومان میگیرد و آرگومان دیگر از نوع float است. زمانی که تابع ()absolute با یک آرگومان integer فراخوانی شود، این تابع فراخوانی میشود:
اما زمانی که تابع ()absolute با یک آرگومان float فراخوانی شود، تابع زیر فراخوانی میشود:
بدین ترتیب به پایان این بخش از سری مقالات آموزش زبان برنامهنویسی ++C میرسیم.
ماژول http در Node.js تابعها و کلاس مفیدی برای ساختن سرور HTTP ارائه میکند. در واقع یک ماژول کلیدی Node.js برای شبکه محسوب میشود. در این نوشته به بررسی کارکردهای مختلف این ماژول میپردازیم. برای مطالعه بخش قبلی این مجموعه مقالات آموزشی به لینک زیر رجوع کنید:
شما میتوانید با استفاده از دستور زیر این ماژول را در فایل خود include کنید:
ماژول مورد اشاره برخی مشخصهها و متدها و همچنین برخی کلاسها را ارائه میکند.
در این بخش به بررسی مشخصههای ماژول http میپردازیم.
این مشخصه لیستی از همه متدهای مورد پشتیبانی HTTP را ارائه میکند:
این مشخصه همه کدهای حالت HTTP و توصیف آنها را لیست میکند:
این مشخصه به وهلهای سراسری از شیء Agent اشاره میکند که وهلهای از کلاس http.Agent است. این مشخصه به مدیریت اتصالهای دائمی میپردازد و از آنها برای کلاینتهای HTTP استفاده مجدد میکند و مؤلفهای کلیدی برای شبکهبندی HTTP در Node.js محسوب میشود. برای مشاهده توضیحات بیشتر در خصوص http.Agent به ادامه همین مقاله مراجعه کنید.
در این بخش متدهای موجود در ماژول http را معرفی میکنیم.
این متد یک وهله از کلاس http.Server بازگشت میدهد. کاربرد آن به صورت زیر است:
یک درخواست HTTP به سرور ایجاد میکند و وهلهای از کلاس http.ClientRequest میسازد.
مشابه ()http.request است، اما به صورت خودکار متد HTTP را روی GET تنظیم میکند و ()req.end را به صورت خودکار فراخوانی میکند.
ماژول HTTP پنج کلاس ارائه میکند که در ادامه به آنها میپردازیم:
Node وهلهای سراسری از کلاس http.Agent برای مدیریت تداوم اتصال و استفاده مجدد از کلاینتهای HTTP ارائه میکند که مؤلفهای کلیدی برای شبکهبندی HTTP محسوب میشود. بدین ترتیب مطمئن میشویم که هر درخواست که به سرور ارسال میشود صفبندی شده و یک سوکت منفرد مورد استفاده مجدد قرار میگیرد. همچنین یک استخر از سوکتها نگهداری میکند که برای حفظ عملکرد مؤلفهای کلیدی محسوب میشود.
هر شیء http.ClientRequest زمانی که ()http.request یا ()http.get فراخوانی میشود، ایجاد خواهد شد. زمانی که پاسخی دریافت میشود، رویداد response با استفاده از پاسخ فراخوانی میشود و آرگومان آن نیز وهلهای از http.IncomingMessage است.
در مورد دادههای بازگشتی یک پاسخ را میتوان به 2 روش خواند:
این کلاس به طور معمول زمانی وهلهسازی و بازگشت داده میشود که یک سرور جدید با استفاده از ()http.createServer ساخته میشود.
زمانی که یک شیء سرور دارید، به متدهای آن نیز دسترسی دارید:
این کلاس به وسیله http.Server ساخته شده است و به عنوان پارامتر دوم به رویداد request ارسال میشود. این کلاس به طور معمول در کد به صورت res نوشته و استفاده میشود:
متدی که معمولاً در دستگیره فراخوانی میشود ()end نام دارد که موجب بسته شدن response میشود و بدین ترتیب با کامل شدن پیام، سرور میتواند آن را به کلاینت بفرستد. آن را باید روی هر پاسخ فراخوانی کرد.
از این متدها برای تعامل با هدرهای HTTP استفاده میشود:
پس از پردازش هدرها میتوان آنها را مستقیماً با فراخوانی ()response.writeHead به کلاینت ارسال کرد. این متد یک statusCode به عنوان پارامتر اول میگیرد و پیام وضعیت و شیء هدر نیز اختیاری هستند.
برای ارسال دادهها به کلاینت در بدنه پاسخ باید از متد ()write استفاده کنید. این متد دادههای بافر شده را به استریم پاسخ HTTP میفرستد.
اگر هدرها با استفاده از ()response.writeHead ارسال نشده باشند، ابتدا به همراه کد وضعیت و پیام آن که در درخواست تنظیم شده فرستاده میشوند. این موارد را میتوانید با تنظیم مقادیر مشخصههای statusCode و statusMessage تغییر دهید.
یک شیء http.IncomingMessage به صورت زیر ساخته میشود:
از این کلاس میتوان برای دسترسی به اجزای پاسخ به صورت زیر استفاده کرد:
این دادهها با استفاده از استریمها در دسترس ما قرار میگیرند، زیرا http.IncomingMessage اینترفیس Readable Stream را پیادهسازی میکند.
بدین ترتیب به پایان این بخش از سری مقالات آموزش Node.js میرسیم.
اگر
منبع: فرادرس
تصور کنید ایدهای عالی برای ساخت یک اپلیکیشن برای گوشیهای هوشمند دارید و میخواهید بدانید که چگونه باید شروع به این کار بکنید؟ در این مقاله با شیوه ساخت یک اپلیکیشن و تبدیل ایده به محصول نهایی آشنا میشوید، به طوری که افراد مختلف میتوانند اپلیکیشن شما را از اپاستور اپل یا پلیاستور گوگل دانلود کنند. در ادامه با مراحل طراحی یک اپلیکیشن آشنا خواهیم شد.
در این نوشته با اهمیت ضروری تحقیق آشنا میشویم و این نکته را روشن میسازیم که چرا باید در مورد مفهوم اپلیکیشن خود شور و اشتیاق داشته باشید. همچنین به شما کمک میکنیم که مهارتهای مختلف مورد نیاز برای موفقیت را بیاموزید و مفاهیم ارزشمندی که میتوانید برای ساخت تجربه کاربری اپلیکیشنتان مورد استفاده قرار دهید را میشناسیم.
اغلب افراد در نخستین گام وسوسه میشوند که مستقیماً شروع به تفکر در مورد روش ساخت اپلیکیشن بکنند، اما همواره باید مسیر توسعه اپلیکیشن را با به دست آوردن ایدهای روشن از هدف خود آغاز کنید. برای این که بدانید معنی این حرف چیست، باید در مورد کاری که اپلیکیشنتان انجام میدهد، ایده روشنی داشته باشید، همچنین بدانید که کاربران اپلیکیشن شما چه کسانی هستند و به چه صورت از اپلیکیشن شما استفاده خواهند کرد. بدین ترتیب باید این سؤالها را از خودتان بپرسید:
این نوع از تحقیق به معنی صحبت کردن با افراد مختلف و بررسی نظرات آنها در مورد ایده اپلیکیشن است. گرچه این کار ممکن است ملالآور به نظر برسد، اما لازم نیست نگران باشید، چون شما یک شرکت بزرگ نیستید که نیاز به مصاحبه با هزاران نفر داشته باشید، صحبت کردن با دوستان، خانواده، همکاران، و یا همکلاسها نیز در این خصوص به قدر کافی مفید است.
همچنین باید در مورد اپلیکیشنهایی که اپ شما با آنها رقابت خواهد کرد نیز تحقیق کنید. کاوش پلیاستور یا اپاستور برای یافتن اپلیکیشنهایی که کاری مشابه ایده محصول شما انجام میدهند به این منظور مفید خواهد بود. این اپلیکیشنها را روی گوشی خود دانلود کنید تا بتوانید کاری که اجرا میکنند را تحلیل کرده و قابلیتهایی که ارائه میدهند را مورد بررسی قرار دهید. از خود بپرسید آیا اپلیکیشنهای مربوطه وظایفی که در نظر دارند را با موفقیت اجرا میکنند و اگر چنین است ایده آنها با مفهومی که شما در ذهن خود دارید چه نسبتی دارد؟ درک اپلیکیشنهای رقیب به شما کمک میکند که ارزشهای خاص اپلیکیشن خود را درک کنید. بدین ترتیب میتوانید در صورت نیاز ایدههای خود را طوری اصلاح کنید که کاربران، خدماتی که شما ارائه میکنید را جای دیگری نتوانند پیدا کنند.
نکته مهم: اگر نمیخواهید منحصربهفرد باشید، در این صورت باید بهتر از رقبا باشید.
هر زمان که از یک اپلیکیشن محبوب خود استفاده میکنید، تلاش کنید با دیدی تحلیلی به بررسی آن چه موجب جذب شما به آن شده است نگاه کنید. آیا محتوای آن به خوبی سازماندهی یافته است؟ آیا طراحی آن روی گوشی شما عالی به نظر میرسد. آیا از سرعت کارکرد آن تحت تأثیر قرار میگیرید؟ با چند ضربه روی صفحه گوشی میتوانید هدف مورد نظر خود را اجرا کنید؟ آیا امکاناتی وجود دارند که هرگز استفاده نکردهاید؟ آیا فکر میکنید طراحی آن تکیه زیادی روی متن دارد؟ چنین تفکرهای نقادانهای میتواند به ایجاد درکی از شیوه ایجاد تجربه کاربری اپلیکیشن خودتان کمک کند.
بسیار مهم است در مورد پروژهای که برای ساخت انتخاب میکنید از آغاز اشتیاق داشته باشید. نخستین اپلیکیشن شما نیاز به تعهد کاری بالا دارد و این که انرژی شما در طول پروژه نوسان داشته باشد، کاملاً طبیعی است اما کار کردن روی چیزی که در مورد آن اشتیاق دارید موجب خواهد شد که متمرکز بمانید و برای به پایان رساندن پروژه انگیزه کافی داشته باشید.

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

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