At the time of writing this post, default ASP.NET Core SPA templates allow you to create Angular 5 based app with Visual Studio without installing any third-party extensions or templates. Angular 6 is out now and you can also upgrade the Angular 5 app to Angular 6 . What if you want to create Angular 6 app with VS 2017? This post talks about how to create an Angular 6 App with Visual Studio 2017 and how to extend it with a simple example.
Bootstrap 5.1.1 منتشر شد
Notepad++ v8 منتشر شد
TypeScript 3.8 RC منتشر شد
class Person { #name: string constructor(name: string) { this.#name = name; } greet() { console.log(`Hello, my name is ${this.#name}!`); } } let jeremy = new Person("Jeremy Bearimy"); jeremy.#name // ~~~~~ // Property '#name' is not accessible outside class 'Person' // because it has a private identifier.
Rider 2018.1 منتشر شد
5 Angular منتشر شد
We are pleased to announce version 5.0.0 of Angular, pentagonal-donut. This is a major release containing new features and bugfixes. This release continues our focus on making Angular smaller, faster, and easier to use.
کار این کلاس در واقع ترکیب کلاسها و کتابخانههای کاری مشخص است که نیاز به ارتباط با یکدیگر را دارند. به عنوان مثال یک برنامه کتابخانه، برای وظیفهای چون امانت یک کتاب نیاز است تا چندین کلاس مختلف را با یکدیگر به کار بگیرد که این وظایف شامل موارد زیر میباشند:
- بررسی وجود کتاب
- بررسی تعداد موجود یک کتاب در کتابخانه
- بررسی وضعیت امانی کتاب (آیا کتاب در دست کسی از قبل امانت است؟ یا کتاب برای امانت آزاد است؟)
- در صورتی که کتابی بیش از زمان مورد نظر در دست کسی امانت است، با یک پیامک از او بخواهیم که کتاب را بازگرداند.
در کد زیر ما قصد داریم نمونهای از اجرای این الگو را ببینیم. ابتدا سه کلاس اطلاعاتی زیر را ایجاد میکنیم:
کلاس کتاب Book:
class Book { public int Id { get; set; } public string Title { get; set; } public int Quantity { get; set; } public bool IsLoanable { get; set; } }
کلاس کاربر User
class User { public int Id { get; set; } public string Title { get; set; } public string CellPhoneNumber { get; set; } }
کلاس امانت Loan
class Loan { public DateTime ExpiredDate { get; set; } public User User { get; set; } }
بعد از آن سه کلاس را برای مدیریت کتاب، مدیریت امانت و مدیریت پیامکی، ایجاد میکنیم:
کلاس کتاب BookManager:
class BookManager { public Book GetBook(int id) { return new Book() { Id=id, Title = "a book", Quantity = 3, IsLoanable = true }; } }
کلاس LoanManager برای مدیریت امانتها
public int IsLoan(int bookId) { return 2; } public List<Loan> GetLoans(int bookId) { return new List<Loan>() { new Loan() { ExpiredDate = DateTime.Now.AddDays(-15), User = new User() { Id = 2, Title = "User1", CellPhoneNumber = "342342424" } }, new Loan() { ExpiredDate = DateTime.Now.AddDays(5), User = new User() { Id = 56, Title = "User56", CellPhoneNumber = "324324324324" } } }; }
در نهایت سومی کلاس مدیریتی برای پیامک هاست:
class SmsManager { public void SendMessage(string number) { Console.WriteLine("please take back the book to the library : "+number); } }
و در کلاس Facade داریم
class FacadeBookLoan { private readonly BookManager _bookManager; private readonly LoanManager _loanManager; private readonly SmsManager _smsManager; public FacadeBookLoan() { _bookManager = new BookManager(); _loanManager=new LoanManager(); _smsManager=new SmsManager(); } public int IsLoanable(int bookId) { var book = _bookManager.GetBook(2); if (book == null) return -2; if (!book.IsLoanable) return -1; var howManyBookIsLoaned = _loanManager.IsLoan(bookId); if(howManyBookIsLoaned>0) ManageLoaners(bookId); return book.Quantity - howManyBookIsLoaned; } private void ManageLoaners(int bookId) { var loans = _loanManager.GetLoans(bookId); foreach (var loan in loans) { if (loan.ExpiredDate > DateTime.Now) { _smsManager.SendMessage(loan.User.CellPhoneNumber); } } } }
کد بدنه اصلی برنامه:
var myfacade=new FacadeBookLoan(); var loansCount= myfacade.IsLoanable(2); Console.WriteLine(loansCount > 0 ? "you can loan the book" : "you can't loan the book");
please take back the book to the library : 324324324324 you can loan the book
فرض کنید که میخواهیم یک برنامه برای یک فروشگاه نوشیدنی (مانند coffee shop) بنویسیم ، این فروشگاه در ابتدای کار ممکن است ، منوی سادهای جهت ارائه به مشتری داشته باشد. برای مثال ممکن است که فقط 3 یا 4 محصول داشته باشد. بنابراین ممکن است ما برنامهای را که میخواهیم برای این مشتری بنویسیم به صورت زیر طراحی کنیم:
که بسیار طبیعی و درست میباشد. اما حالا در نظر بگیرید که این فروشگاه در آینده ممکن است محصولات خود را افزایش بدهد و یا حالاتی که ممکن است این محصولات با هم ادغام شوند را در نظر بگیرید. برای مثال ممکن است شما بخواهید که قهوهتان را با شیر نوش جان کنید و یا ....
بنابراین تعداد این حالات را در نظر بگیرید که در آینده ممکن است چقدر زیاد بشود:
خوب پس چهکاری ما میتوانیم برای نگهداری این برنامه انجام بدهیم؟ یکی از راههایی که ممکن است به فکر ما برسد این است که روش بالا روش احمقانه ای است. چرا ما باید به همهی این کلاسها نیاز داشته باشیم. ما میتوانیم که چاشنیها را در کلاس اصلی نگهداری کنیم و کلاس محصولاتمان را از کلاس اصلی به ارث ببریم اجازه دهید تا این کار را با هم انجام بدهیم
خوب با این روش ما n کلاس تشکیل شده در رویکرد اول را فقط به 5 کلاس تبدیل کردیم. خوب این روشی بسیار ایدهال به نظر میرسد. اما ممکن است در آینده که تعداد چاشنیهای ما بالا میرود و همچنین تعداد محصولاتمان نیز ممکن است بیشتر شود مجبور شویم که تعداد این کلاسها را بیشتر کنیم، و یا فکر کنید که ما میخواهیم هریک از چاشنیهایمان، یک قیمت را نسبت بدهیم. بنابراین مجبوریم که تمامی اینها را در کلاس پایه اضافه کنیم؛ بله درست است، ما با کلاس پایهی حجیمی روبرو میشویم که بیشتر خواص و یا متدهای آن برای زیر کلاسهای دیگر مناسبت نیستند. خوب آیا روش بهتری برای جلوگیری از این مشکل داریم؟ بلی.
خوب ما به این مسئله به این صورت نگاه میکنیم که شروع میکنیم با نوشیدنیها و آنها را با چاشنیها در زمان اجرا تزیین (Decorate) میکنیم؛ نه کامپایل.
برای مثال اگر مشتری ما یک نوشیدنی DarkRoast با Mocha و Whip خواست، سپس ما :
1- یک شی از DarkRoast ایجاد میکنیم .
2- آن را با یک شی از Mocha تزئین میکنیم.
3- آن را با یک شی از Whip - تزیین میکنیم.
4- متد Cost() را صدا میزنیم و یک Delegation را برای اضافه کردن قیمت چاشنیها در نظر میگیریم.
بسیار خوب؛ اما ما عملیات تزئین یک شی را چگونه انجام میدهیم و delegation ما چگونه عمل میکند .
یک اشاره : به شیء تزئین کننده، مانند یک Wrappers فکر کنید. اجاز بدهید ببینم که چه طور این کار را انجام میدهیم.
1- یک شی از DarkRoast ایجاد میکنیم.
3- آن را با یک شی از Whip تزیین میکنیم
4- حالا زمان محاسبه قیمت محصول برای مشتری فرا رسیده است. ما این کار را را با صدا زدن بیرونیترین Decorator(Whip) انجام میدهیم و شی whip به کمک Delegate مابقی توابع cost را صدا میزند.
public abstract class Beverage { string description ="unknow beverage"; public String getDescription(){ return description; } public abstract double cost(); } public abstract class CondimentDecorator extends Beverage { public abstract string getDescription(); } public class Espersso extends Beverage{ public Espersso() { description="Espersso"; } public double cost(){ return 1.99; } } public class HouseBelend extends Beverage { public HouseBelend() { description="HouseBelend"; } public double cost() { return .89; } } public class mocha extends condimateDecorator { Beverage beverage; public mocha(Beverage beverage) { this.beverage=beverage; } public string getDescription(){ return beverage.getdescription() + "Mocha"; } public double cost(){ return .20 +beverage.cost } } // Now Use These classes in Final form Beverage beverage=new Espersso(); //Customers want a coffe with double milk and whip beverage=new mocha(beverage); beverage=new mocha(meverage); beverage=new whip(beverage); system.out.println(beverage.getDescription() + "$" +beverage.cost());