خلاصه کتاب Pragmatic Programmer. درس 14

درس 14: Domain Languagesزبان های برنامه نویسی تاثیر میزارن روی اینکه چگونه به مسئله نگاه و راجعش فکر میکنیم، هر کدومم یکسری از فیچرهایی مثل استاتیک/داینامیک تایپینگ، بایندینگ زود/دیر، فانکشنال و یا شی گرا، مدلهای ارث بری، ماکروها و ... دارند. مثلا، تولید یک راه حل با سی پلاس پلاس مدل ذهنی متفاوتی میخاد و بوجود میاره در مقابل حل همون مسئله با زبان هسکل.(زبان های همه منظوره General Purpose Language که اگر بخایم نام ببریم ده ها مثال مثل: C, C#, Java, Python, JS, Rust, Dart, VB, Ruby, Go, Lua, Kotlin, Swift, Perl, F#, Scala, Erlang, C++, Haskell و ...)( زبان دامنه، یا زبان خاص دامنه Domain Language, or Domain Specific Language ، زبانهایی هستن که برای یک حوزه خاص یا حتی مسئله خاص طراحی شدن و فقط قابلیت های همون حوزه رو دارند، مثلا زبان نشانه گذاری ابرمتنHTML ، زبان توصیف سخت افزار Verilog ، زبان پرس و جو در دیتابیس های رابطه ای SQL ، زبان محاسبات عددی MATLAB و ...)تو بعضی شرایط ممکنه انتخاب کنیم که از زبونای خاص دامنه استفاده کنیم.چند تا مثال بزنیم: RSpecیک کتابخونه برای تست نویسیه در زبان برنامه نویسی روبی، که از زبان های مدرن ایده گرفته، یک تست با RSpecdescribe BowlingScore do it "totals 12 if you score 3 four times" do score = BowlingScore.new 4.times { score.add_pins(3) } expect(score.total).to eq(12) end endCucumberیک زبان برنامه نویسی برای تست نویسی بالاخص تست های رفتاری(behavior driven)، شما میتونید تست ها رو با اون نسخه ازش اجرا کنید که با زبان برنامه نویسی اصلی برنامه تون سازگاری داره.Feature: Scoring Background: Given an empty scorecard Scenario: bowling a lot of 3s Given I throw a 3 And I throw a 3 And I throw a 3 And I throw a 3 Then the score should be 12تست های نوشته شده با Cucumber میتونن توسط کاربران نهایی خونده و بررسی بشن، البته این خیلی به ندرت ممکنه لازم بشه.Phoenix Routesخیلی از وب فریمورکها کتابخونه ها و امکاناتی برای روتینگ دارن، که مپ میکنه ریکوئست ورودی رو به تابع مدنظری در کد، مثالی از فونیکس:scope "/", HelloPhoenix do pipe_through :browser # Use the default browser stackget "/", PageController, :index resources "/users", UserController endAnsibleیک ابزار برای کانفیگ کردن نرم افزارهاست، که برای ریموت سرورها خیلی بهمون کمک میکنه، یک فایل ورودی تنظیمات میگیره و اونو اعمال میکنه روی سرورهای میرور شده، تنظیماتش به فرمت زبون YAML نوشته میشن:-- name: install nginx apt: name=nginx state=latest - name: ensure nginx is running (and enable it at boot) service: name=nginx state=started enabled=yes - name: write the nginx config file template: src=templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf notify:- restart nginxاین مثال برای کاربردی هست که میخایم مطمئن بشیم اخرین نسخه انجین ایکس روی سرورهامون نصب هست، و استارت شده به صورت پیشفرض.خوب اگر دیتیل بشیم به مثالهایی که زدیم، Rspec و Phoenix router با همون زبون برنامه نویسی که هاست میشن نوشته شدن یعنی روبی و Elixir ، در کنار اون یکسری متاپروپرمینگ و ماکرو هم استفاده کردن، ولی کامپایل و رانشون مثل کدهای عادی است.Cocumber test و Ansible Configuration به زبون خودشون نوشته شدن، یک تست کاکامبر تبدیل میشه به کد و بعد اجرا میشه، تنظیمات آنسیبل هم کانورت میشه به دیتااستراکچر مدنظر بعد لود میشه توی انجین آنسیبل.فونیکس روتر و Rspec امبد میشن توی کدتون و با همون هم اجرا میشن، ولی کاکامبر و آنسیبل توسط کدتون خونده و کانورت میشن و بعد استفاده میشن.ما Rspec , Phoenix رو زبان دامنه داخلی مینامیم Internal Domain Language و کاکامبر و آنسیبل External Language هستند.Trade-offs Between Internal/External Languageزبان دامنه داخلی از امکانات و قدرت زبانی که در اون داره تعریف میشه استفاده میکنه، و نقطه منفی شم همین وابسته بودن به سینتکس و محیط اون زبان هستش.در مقابلش زبونهای خارجی هیچ وابستگی به زبان برنامه نویسی محیط پروژتون نداره و میتونید حتی براش پارسر بنویسید و ابداع کنید یا از پارسرهای موجود (مثل آنسیبل که از پارسر YAML استفاده میکنه) استفاده بشه.قطعا نوشتن پارسر و دردسرهاشم باید در نظر بگیرید، پس بهتره از گزینه های موجود استفاده کنید، قطعا در استفاده از زبان دامنه باید ترید اف کنید که اصلا ارزشش رو داره با توجه به پروژه تون و اسکیل کاری.دروس مرتبط: 8, 13, 32سرچ خودم راجع به موضوع این درس:Some languages used for DSLs(Domain Specific Language) include:· Web: HTML· Shell: sh, Bash, CSH, and the likes for *nix; MS-DOS, Windows Terminal, PowerShell for Windows· Markup languages: XML· Modeling: UML· Data management: SQL and its variants· Business rules: Drools· Hardware: Verilog, VHD· Build tools: Maven, Gradle· Numerical computation and simulation: MATLAB (commercial), GNU Octave, Scilab· Various types of parsers and generators: Lex, YACC, GNU Bison, ANTLRچرا DSL؟برای شناسایی یا داکیومنت رفتار و نیازمندیهای دامین خاصی از سیستم استفاده میشه، ممکنه بین دیزاینرها و برنامه نویسها در پروسه تولید نرم افزار استفاده بشه، ممکنه بین مشاوران بیزنس یا تحلیلگرها و برنامه نویسها استفاده بشه برای شناسایی دقیق تر سیستم، حتی میشه تو حوزه کد جنریشن هم ازش بهره برد.از مزیتهاش میشه به آسون تر بودن یادگیریش نسبت به زبانهای برنامه نویسی اشاره کرد، این فرصتی رو ایجاد میکنه تا مهندسین دیگر حوزه ها مثل صنایع بتونن در پروژه ها بمنظور شناسایی دامین های بیزنسی و دیتیل نیازمندیها ازش بهره ببرند.دروس مرتبط: 8, 13, 32منبع کانال تلگرامی: https://t.me/pragmaticprogrammer_fa