Fluent Interface در برنامه نویسی شی گرا چیست؟
Fluent Interface و یا حتی Fluent API یکی از روش های برنامه نویسی شی گرا برای نوشتن کدهای قابل فهم تر می باشد. بدون شک تا به حال کاربردهای مختلفی از Fluent API را در برنامه های خود دیده اید. یکی از کاربردهای بسیار معمول استفاده از Fluent API در Entity Framework Core برای انجام پیکربندی است. در رابطه توصیه می کنیم حتماً از انجام پیکربندی (Configuration) در Entity Framework Core با Fluent API دیدن کنید. در این آموزش از وبسایت پرووید در رابطه با طراحی اینگونه Interface ها صحبت خواهیم کرد. این آموزش به صورت رایگان منتشر شده است. لیست کامل این سری دروس را می توانید در قسمت زیر مشاهده کنید.
یک Fluent Interface چیست؟
به بیان ساده یک fluent interface روشی برای طراحی کردن API های شی گرا و یا object-oriented است که اساساً براساس تکنیک زنجیر کردن متدها و یا method chaining پیاده سازی می شود. هدف اصلی استفاده کردن از fluent interface ها افزایش دادن قابلیت خوانایی و یا readability کد می باشد. این موضوع کمک می کند تا بتوانید زبان مربوط به یک domain خاص و یا اصطلاحاً domain-specific language را نیز در اینترفیس طراحی شده ایجاد کنید. به عنوان یک برنامه نویس شما اغلب functionality های خود را از طریق کلاس ها و آبجکت ها در اختیار برنامه نویسان دیگر قرار می دهید. گاهی کدهایی که برای انجام وظایف مختلف خود به آنها نیاز دارید، می توانند پیچیده بشوند. برای کاهش پیچیدگی، ممکن است به تکنیک ها و روش هایی فکر کنید که کد شما را طبیعی تر و قابلیت خوانایی آن را افزایش بدهد. یکی از این روش ها fluent interface و method chaining یعنی زنجیر کردن متدها می باشد. نرم افزار هایی که با روش های شی گرا نوشته شده اند، اغلب از مجموعه بزرگی از کلاس ها و آبجکت ها استفاده می کنند. برای انجام دادن یک وظیفه و یا task در چنین نرم افزارهایی از کلاس ها و آبجکت ها به روش های مختلف استفاده می گردد. گاهی مصرف کردن کلاس ها و آبجکت ها، باعث ایجاد پیچیدگی می شود. از همین جهت، از روش های مختلف برای کاهش دادن پیچیدگی استفاده می گردد. fluent interface یک تکنیک است که به شما کمک می کند، پیچیدگی های موجود در کد را با ایجاد کردن یک زبان خاص حوزه و یا domain specific language که شامل متدهای مختلفی می باشد کاهش بدهید. fluent interface ها می توانند باعث افزایش قابلیت خوانایی کد شما وسط طبیعی بودن آن بشوند. اساس کار fluent interface مبتنی بر زنجیر کردن متدها و یا method chaining می باشد. در ادامه مقایسه ای را بین fluent Interface ها و extension method ها، خواهیم داشت. در نگاه کلی، fluent interface و extention method رسالت مشابهی دارند. هر دوی این روش ها از موضوعات مختلفی نیز رنج می برند. برای مثال، اشکال زدایی و یا debug کردن extention method ها و fluent interface ها گاهی غیر ممکن است. نتایج میانی غیر قابل ذخیره کردن هستند. ضمناً syntax مربوط به هر دو می توانند تا حد زیادی شبیه به هم باشند اما بین extention method ها و fluent interface تفاوت هایی نیز وجود دارد که در ادامه به آنها می پردازیم:
ویژگی های Extention Method ها
- نوع خروجی و یا returned type مربوط به یک extention method ثابت و یا constant می باشد. به عبارت دیگر یک extention method یک آبجکت از یک type یکسان را برمی گرداند.
- حلقه زدن و یا استفاده کردن از loop ها امکان پذیر است. به عبارت دیگر برنامه نویس می تواند یک متد را با تکنیک زنجیر کردن متدها مورد استفاده قرار بدهد و در هر فراخوانی و یا call آن متد را اجرا کند.
- جملات یکی پس از دیگری اجرا می شوند و نتایج حاصل وابسته به نتیجه اجرا های قبلی می باشد.
ویژگی های fluent interface ها
- نوع خروجی و یا returned type متدهای ایجاد شده با روش fluent interface از یک متد به متد دیگر متفاوت است. این موضوع خود باعث افزایش قابلیت انعطاف پذیری و گسترش می شود.
- استفاده کردن از حلقه ها و یا loop ها می توانند خطر ساز شوند. البته متدها می توانند طبق ترتیب های از قبل تعریف شده ای با یکدیگر ترکیب بشوند.
جملات و یا دستورات در انتهای کار اجرا می شوند. - تکنیک زنجیر کردن و یا chaining به منظور جمع آوری کردن داده ها و ایجاد کردن مسیرها و یا همان path ها، مورد استفاده قرار می گیرند.