Scala به طور کلی برگ برندههای بسیاری در مقابل سایر زبانهای برنامهنویسی سطح بالا همچون Java دارا است اما یکی از مهمترین آنها، اصطلاحاً Multi Paradigm بودن این زبان است که توانسته نظر بسیاری از دولوپرها را به خود جلب کند. پیش از این در مقالهای تحت عنوان آشنایی با زبان برنامهنویسی Scala، به بررسی کلیات این زبان و مقایسهٔ آن با جاوا پرداختیم و این در حالی است که در این مقاله قصد داریم روی دلایلی که شما را مجاب میکند به سمت این زبان کشیده شوید، تمرکز کنیم.
چند پارادایمی بودن زبان اسکالا
دولوپرها برای افزایش مهارتهای برنامهنویسی خود میبایست حداقل یک زبان از انواع مختلف پارادایمها را یاد بگیرند. به طور کلی، از جمله پارادایمهای مختلف برنامهنویسی میتوان مواردی همچون Imperative ،Logical ،Functional و OOP را نام برد. اسکالا از دو شیوۀ متفاوت برنامهنویسی شیئگرا (OOP) و برنامهنویسی فانکشنال (Functional) پشتیبانی میکند؛ بنابراین این زبان برنامهنویسی سطح بالا به دولوپرها این امکان را میدهد تا مهارت هر دو نوع شیوۀ کدنویسی فانکشنال و شیئگرا را در کنار هم داشته باشند.
همانند دیگر زبانهای برنامهنویسی فانکشنال (تابعمحور)، در اسکالا توابع مقادیر اصطلاحاً First Class هستند؛ به این معنا که شما میتوانید آنها را مانند سایر مقادیر به عنوان آرگومان ورودی به توابع دیگر پاس دهید. همچنین زبان اسکالا از توابع به اصطلاح Anonymous (بینام) و Currying نیز پشتیبانی میکند که ترکیب این ویژگیها در این زبان موجب میشود تا کدهای نوشته با آن کاملاً مختصر و زیبا باشند (Currying تکنیک تبدیل یک تابع چندآرگومانی به تابعی با تنها یک آرگومان است؛ این آرگومان مقداری برابر با اولین آرگومان تابع اصلی را خواهد داشت. در ادامه، تابع Currying یک تابع دیگر را با ورودی آرگومانهای باقیمانده فراخوانی خواهد کرد.)
Multi Paradigm (چند پارادایمی) بودن یکی از نقاط قوت اسکالا است که جاوا نیز در نسخۀ 8 خود و در تلاش برای رسیدن به آن، فیچری تحت عنوان Lanbda Expressions را معرفی کرد که اولین گام جاوا برای تبدیل شدن به شیوۀ برنامهنویسی فانکشنال بود. یکی از قابلیتهای دستورات لامبدا این است که میتوان یک فانکشن را به عنوان پارامتر به فانکشنی دیگر ارسال کرد و این در حالی است که برنامهنویسی فانکشنال در زبان اسکالا همیشه قویتر از زبان جاوا بوده است که البته موضوع بحث این مقاله نیست.
قابلیت ترکیب اسکالا با جاوا
یکی دیگر از مزیتهای اسکالا، قابلیت ترکیب آن با زبان جاوا است. به عبارتی، برنامههای نوشته شده با اسکالا را میتوان در ماشین مجازی جاوا (JVM) اجرا کرد. همچنین دولوپرهای اسکالا میتوانند به سادگی در کد خود از کدهای جاوا نیز استفاده کنند؛ بدین معنا که دولوپرهای زبان اسکالا میتوانند از لایبرریهای موجود در زبان جاوا به طور مستقیم در توسعهٔ نرمافزارهای خود استفاده کنند (در ضمن، این امکان نیز برای دولوپرها فراهم شده است تا بتوانند کدهای اسکالا را از جاوا فراخوانی کرده و به سادگی بخشی از برنامۀ خود را به زبان اسکالا و بخشی دیگر را با جاوا بنویسند و به همین دلیل، بسیاری از دولوپرهای زبان جاوا به برنامهنویسی با اسکالا روی میآورند و این یک روش عالی برای ایشان است تا بتوانند از سالها تجربۀ خود در کدنویسی جاوا استفاده کرده و تبدیل به یک دولوپر اسکالای حرفهای در بازار کار شوند.)
به طور کلی، قابلیت ترکیب کدهای اسکالا با جاوا موجب میشود تا پلتفرم اسکالا پتانسیل بالایی به منظور تبدیل شدن به زبان برنامهنویسی اصلی کسبوکارهای مختلف را داشته باشد، زیرا بسیاری از پروژههای بزرگ به زبان جاوا نوشته شدهاند و بسیاری از دولوپرها نیز در حال کدنویسی با این زبان هستند (برای شروع یادگیری زبان جاوا، میتوانید به دورهٔ آموزش زبان جاوا در سکان آکادمی مراجعه نمایید.)
بهترین راهکارها و الگوهای ساختهشده در زبان اسکالا
یکی از موضوعاتی که شاید کمتر کسی از آن مطلع باشد این است که زبان اسکالا در ابتدا در دانشگاه EPFL سوئیس و در تلاش برای اِعمال نوآوریهای اخیر در حوزۀ زبانهای برنامهنویسی به یک زبانی توسعه داده شد که این زبان بتواند توجه اکثر دولوپرها را به خود جلب کند؛ دقیقاً چیزی همچون زبان جاوا.
یکسری اصطلاحاً Best Practice و الگوها در زبانهای برنامهنویسی ساخته میشوند که به عنوان مثال برای اسکالا میتوان مواردی همچون کیورد val (با استفاده از آن میتوان متغیرهای غیرقابلتغییر را تعریف کرد) که بهینه شدۀ کیورد final در جاوا یا const/read-only در سیشارپ با قوانین دشوار مرتبط با آن است را نام برد (برای آشنایی بیشتر با کیورد final در جاوا، به آموزش معرفی کلیدواژهٔ final در زبان برنامهنویسی جاوا مراجعه کنید.)
همچنین اسکالا قابلیتی تحت عنوان Case Class دارا است که این امکان را برای دولوپرها فراهم میکند تا بتوانند کلاسهای غیرقابلتغییر در این زبان تعریف کنند. علاوه بر این، اسکالا فیچری با عنوان Closure نیز ارائه داده است؛ زبانهای پویایی مانند پایتون و روبی به واسطۀ شیوۀ برنامهنویسی فانکشنال این فیچر را دارا هستند. کلوژور یک تابع به اصطلاح Anonymous (بینام) است که به سایر توابع این امکان را میدهد تا به متغیرهای بیرون از اسکوپ تعریفشده برای آن تابع دسترسی داشته باشند و مقداری را بسته به تعداد متغیرهایی که به عنوان آرگومان ورودی دریافت میکند، برمیگرداند.
صریح و واضح بودن زبان اسکالا
اگر بخواهیم زبان اسکالا را با زبانی مانند جاوا مقایسه کنیم، اسکالا زبان بسیار قابلفهمتری است. همچنین کدهایی که با زبان اسکالا نوشته شدهاند، بسیار زیبا و کاربردی هستند و همین مسئله نیز موجب میشود تا دولوپرهای جاوا هرچه بیشتر به یادگیری زبان اسکالا علاقهمند شوند.
برای مثال، در ادامه یک اصطلاحاً POJO در هر دو زبان خواهیم ساخت که از آن طریق به راحتی میتوان تفاوت بین کدنویسی در این دو زبان را مشاهده کرد (POJO مخفف واژگان Plain Old Java Object است.) در واقع، برای کدنویسی این برنامه در اسکالا تنها چند خط کد لازم است و این در حالی است که در جاوا تعداد خطوط به مراتب بیشتری لازم است به طوری که در جاوا داریم:
public class User {
private String name;
private List orders;
public User() {
orders = new ArrayList();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getOrders() {
return orders;
}
public void setOrders(List orders) {
this.orders = orders;
}
}
public class Order {
private int id;
private List products;
public Order() {
products = new ArrayList();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List getProducts() {
return products;
}
public void setProducts(List products) {
this.products = products;
}
}
public class Product {
private int id;
private String category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
اما نمونهٔ کد فوق در اسکالا به صورت زیر است:
class User {
var name: String = _
var orders: List[Order] = Nil
}
class Order {
var id: Int = _
var products: List[Product] = Nil
}
class Product {
var id: Int = _
var category: String = _
}
البته زبان جاوا به واسطۀ ویژگیهای اضافهشده به نسخۀ 8 آن کمی بهبود یافته است (که این ویژگیها در این مثال به کار برده نشدهاند). با این وجود، اسکالا در کدنویسیهای مختصر و تمیز، همچنان رتبۀ بالاتری نسبت به جاوا دارد.
فرصتهای شغلی بهتر برای زبان اسکالا
برنامهنویسان همواره در حال یادگیری تکنولوژیها و فریمورکهای جدید هستند به این دلیل که قصد به دست آوردن یک شغل خوب را دارند و همچنین بر این عقیدهاند که رشد حرفهای در یادگیری تکنولوژیهای جدید است. در همین راستا، یادگیری زبان برنامهنویسی اسکالا مطمئناً موجب میشود تا دولوپرها مهارتهایی را کسب کنند که خواهان بیشتری در بازار کار دارند. در حال حاضر نیز این زبان توسط شرکتهای بزرگی همچون Twitter ،LinkedIn ،Foursquare و Quora مورد استفاده قرار میگیرد.
در برخی فریمورکهای وب نیز از زبان اسکالا استفاده شده است؛ برای مثال، وبسایت Quora فریمورک اختصاصی خود را با زبان اسکالا توسعه داده است و مسائلی از این دست موجب میگردند تا به نظر رسد که تمام شرایط برای اینکه زبان اسکالا به عنوان جایگزین خوب برای زبان جاوا تبدیل شود، مهیا است.
تایپ استاتیک بودن زبان اسکالا
به طور کلی، یک زبان تایپ استاتیک مانند جاوا که در اینگونه زبانها تعریف متغیرها قبل از استفاده از آنها انجام میشود، موجب شده است تا دولوپرها از نوشتن برنامههایی که دارای باگهای جزئی بوده و در برابر آیندهای ناشناخته آسیبپذیرند محدود شوند چرا که در اینگونه زبانها، تحلیل کدها قبل از اجرای برنامه انجام میشود و باگهای احتمالی شناسایی شده و رفع میشوند اما این در حالی است که در زبانهای دینامیکی مانند پایتون، باگها در هنگام اجرای برنامه مشخص میشوند!
اسکالا این دو ویژگی خوب را یکجا دارد؛ به عبارت دیگر، اسکالا یک زبان دینامیک است و در عین حال هم به شدت تایپ استاتیک. کامپایلر اسکالا واقعاً هوشمند است و به طور کامل از مکانیزم Type Inference استفاده میکند (Type Inference مکانیزمی است که در آن برنامهنویسان میتوانند بدیهیاتی همچون تعریف نوع متغیرها را حذف کنند چرا که تعیین نوع متغیر در اسکالا ضرورتی نداشته و کامپایلر هوشمند آن میتواند نوع متغیر را با توجه به مقداردهی اولیۀ انجام شده برای آن، تشخیص دهد. لازم به ذکر است که قابلیت Type Inference برای توابع نیز کاربرد دارد که عملکرد این قابلیت در زبان اسکالا بهتر از عملکرد محدود آن در زبانهایی همچون جاوا و سیشارپ است.)
فریمورکهای در حال رشد برای زبان اسکالا
همانطور که ممکن است مطلع باشید، زبان برنامهنویسی اسکالا در حال رشد است و لایبرریها و فریمورکهای بسیاری برای آن عرضه شده است. همچنین استفادۀ فراوان شرکتها و به طور کلی صنعت از این زبان نیز به رشد آن به عنوان یکی از زبانهای اصلی بازار کار کمک میکند. از جمله فریمورکهای مطرح وب برای زبان اسکالا میتوان فریمورکی همچون Udash را نام برد.
Akka یکی دیگر از فریمورکهای کانکارنت مبتنی بر اسکالا است و به نوعی یک Toolkit است که روی ماشین مجازی جاوا و برای ایجاد اپلیکیشنهایی با همزمانی بالا، توزیعشده و همچنین اپلیکیشنهای مبتنی بر رویداد و مقاوم در برابر خطا به کار برده میشود.
با گذر زمان، یکسری IDE که از سینتکس زبان اسکالا پشتیبانی میکنند نیز بیشتر میشود (البته در حال حاضر نرمافزارهایی همچون Eclipse و IntelliJ بیشترین پشتیبانی را از این زبان دارند.) همچنین ابزارهای بیلدی مانند SBT،Maven و Ant نیز از ابزارهای مطرح برای کامپایل کدهای اسکالا هستند.
جامعۀ رو به رشد توسعهدهندگان اسکالا
علاوه بر پیشرفتهای زبان اسکالا و فریمورکهای مربوط به آن، جامعۀ اسکالا -یعنی برنامهنویسان این زبان- نیز در حال رشد است به طوری که برخی دولوپرهای جاوا نیز در حال پیوستن به گروه برنامهنویسان اسکالا هستند.
لازم به ذکر است برای اینکه اسکالا بتواند به عنوان جایگزین واقعی جاوا قلمداد شود، باید دولوپرهای جاوای بیشتری جذب این زبان شوند. همچنین استفادۀ شرکت بزرگ و مطرحی مانند توئیتر از زبان اسکالا، قطعاً به رشد جامعۀ اسکالا کمک خواهد کرد (جامعۀ دولوپرهای اسکالا در فرومهایی همچون استک اورفلو نیز رو به رشد است؛ بنابراین پیدا کردن پاسخ هرگونه سؤال در مورد برنامهنویسی اسکالا که به تجربۀ یادگیری ایشان اضافه کند، کار سختی نخواهد بود.)
سینتکس دقیق زبان اسکالا
با وجود اینکه سینتکس زبان جاوا قابلفهم است، اما یکی از بزرگترین عیبهای آن لزوم نوشتن تعداد خط کد فراوان و تکرار آنها به منظور انجام کاری کوچک است اما این در حالی است که در زبان اسکالا یکسری بنچمارک (استاندارد) جدید معرفی شده است تا سینتکس این زبان هم مختصر و هم خوانا باشد. کامپایلر اسکالا که تحت عنوان Scalac شناخته میشود، بسیار هوشمند بوده و میتواند توابعی همچون ()toString() ،equals() ،hasCode و توابع دیگر را برای کد دولوپر تولید کند.
در ادامه، دو بلوک کد از کلاسی یکسان را آوردهایم. این کلاس هم با زبان جاوا و هم با اسکالا نوشته شده است تا تفاوتهای آشکار آنها را ببینید. به عنوان نمونه در زبان جاوا داریم:
public class Book {
private final String name;
private final double price;
public Star(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public int hashCode() {
int hash = 7;
hash = 23 * hash + Objects.hashCode(this.name);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Test other = (Test) obj;
if (!Objects.equals(this.name, other.name)) {
return false;
}
if (Double.doubleToLongBits(this.price) != Double.doubleToLongBits(other.price)) {
return false;
}
return true;
}
@Override
public String toString() {
return "Test{" + "name=" + name + ", price=" + price + '}';
}
}
همین کار را میتوان با استفاده از Case Class اسکالا به راحتی و به صورت زیر انجام داد:
case class Book(name: String, price: double)
همچنین دولوپرها میتوانند از لایبرری Lombok (یکی از مهمترین لایبرریها برای دولوپرهای جاوا) به منظور حذف کدهای تکراری مربوط به توابعی همچون ()getters() ،setters() ،equals() ،hashCode و ()toString استفاده کنند؛ در واقع، لایبرری Lombok میتواند به طور خودکار این توابع را برای دولوپرها فراخوانی کند.
یادگیری نسبتاً آسان زبان برنامهنویسی اسکالا برای دولوپرهای جاوا
برای یک دولوپر Java، یادگیری یک زبان برنامهنویسی فانکشنال کلاسیک مانند Haskell یا OCaml نسبت به Scala مشکلتر است؛ به عبارت دیگر، یادگیری اسکالا به دلیل دارا بودن قابلیت شیئگرایی آن، نسبتاً برای دولوپرهای باسابقهٔ جاوا آسان است. همچنین دولوپرهای جاوا میتوانند به جای آنکه زمان خود را برای یادگیری برنامهنویسی فانکشنال در زبانهای کلاسیک بگذارند، مهارتهای خود در اسکالا را با استفاده از دانش قبلی که در حوزۀ شیئگرایی دارند، افزایش دهند چرا که اسکالا نیز مانند جاوا، دارای سینتکسی تمیز، لایبرریهای خوب و داکیومنتهای آنلاین خوب است.
نتیجهگیری
اگر شروع به یادگیری زبان اسکالا کنید، مطمئناً به این زبان علاقهمند خواهید شد، چرا که این زبان با وجود دارا بودن قابلیت شیئگرایی که موجب میشود کدنویسی در آن بسیار تمیز انجام شود، قابلیت برنامهنویسی فانکشنال (تابعمحور) نیز دارا است. علاوه بر این، اسکالا یک زبان دینامیک یا پویا مانند #پایتون است که دارای یک سیستم تایپ استاتیک نیز میباشد که میتواند دولوپرها را از ایجاد باگهای جزئی در برنامه کمک کند.
حال نوبت به نظرات شما میرسد. آیا تجربهٔ کدنویسی با زبان Scala را در فرایند توسعهٔ نرمافزار دارید؟ و سؤال دیگر اینکه آیا با این گزاره که گفته میشود «اسکالا رقیبی جدی برای جاوا است و قرار است جای آن را بگیرد» موافقید؟ نظرات، دیدگاهها و تجربیات خود را با دیگر کاربران سکان آکادمی به اشتراک بگذارید.