🌀 Specification pattern: C# implementation
در این پست به معرفی الگوی Specification میپردازیم و یک مثال فوق العده کاربردی ارائه میدهیم که یک گام معماری و کدتان به Domain Driven Design و Clean Code نزدیکتر میکند.
*توضیحات تکمیلی : این پست را بهتر است با تلگرام دسکتاب و در سایز maximize مطالعه فرمایید.
🔸 یکی مزایای استفاده از این الگو را میتواند Encapsulation کردن اطلاعاتی که در مورد Domain میباشد دریک قسمت واحد بشمار آورد.
موارد استفاده از این الگو با ذکر یک مثال به طور کامل بیان شده است.
فرض کنید یکی از کلاس های دامین مدل ما کلاس Movie باشد که به صورت زیر تعریف شده است :
برای نوشتن این متد روش های زیادی وجود دارد مانند اکستنشن متد،یا یک متدی که به صورت جداگانه این فیلتر ها را بروی Dbset<Movie> اعمال کند. اما این راه حل ها راهای درستی نیستند و از جمله معیاب آن میتوان به نقض کردن اصل DRY میباشد چون بایستی به ازای هر Dbset این متد ها را که حتی ممکن است logic های یکسانی داشته باشند ، تکرار کنید.
اکنون شاید با خود میگویید خب میتوانیم از یک متد Generic برای جلوگیری از این تکرار استفاده کنیم .
راه حل این مشکل استفاده از الگوی specification است . اما با یک پیاده سازی خاص .در این پست دو پیاده سازی از این الگو ارائه خواهییم داد.
پیاده سازی اول یک پیاده سازی ساده با عنوان Naive implementation است.و در ادامه به سمت بهتر کردن ان پیش میرویم.
اولین راه حل برای مقابله با مشکل بالا (ایجاد متد های متعدد برای شاخص های متعدد در جست و جو و مرتب سازی و..) استفاده از امکان expressions در سی شارپ است تا حدی زیادی آنها خودشان هم یک پیاده سازی از الگوی specification هستند. پس میتوانید یک متد در ریپازیتوری خود بنویسیدکه به عنوان پارامتر یک expression ورودی بگیرد مثال :
حال نوبت به یک پیاده سازیه ساده از الگوی Specification تحت عنوان GenericSpecification میرسد.
@fullStackDevs
در این پست به معرفی الگوی Specification میپردازیم و یک مثال فوق العده کاربردی ارائه میدهیم که یک گام معماری و کدتان به Domain Driven Design و Clean Code نزدیکتر میکند.
*توضیحات تکمیلی : این پست را بهتر است با تلگرام دسکتاب و در سایز maximize مطالعه فرمایید.
🔸 یکی مزایای استفاده از این الگو را میتواند Encapsulation کردن اطلاعاتی که در مورد Domain میباشد دریک قسمت واحد بشمار آورد.
موارد استفاده از این الگو با ذکر یک مثال به طور کامل بیان شده است.
فرض کنید یکی از کلاس های دامین مدل ما کلاس Movie باشد که به صورت زیر تعریف شده است :
public class Movie : Entity
{
public string Name { get; }
public DateTime ReleaseDate{get;}
public MpaaRating MpaaRating {get;}
public string Genre { get; }
public double Rating { get; }
}
public enum MpaaRating🔹 حالا فرض کنیم که کاربر فیلم های تازه ساخته شده را میخواهد تماشا کند. برای نمایش این فیلم ها به کاربر معمولا در Repository مربوطه متدی به شکل زیر تعریف میکنیم :
{
G,
PG13,
R
}
public class MovieRepositoryیا اگر به فیلم هایی براساس Rate یا Genre یا دیگر شاخص ها نیاز داشته باشیم بدین شکل معمولا متد های ریپازیتوری مان را تعریف میکنیم :
{
public IReadOnlyList<Movie> GetByReleaseDate(DateTime minReleaseDate)
{
/* ... */
}
}
public class MovieRepository🔸 ریپازیتوری قدری پیچیده میشود اگر پارامترهای جست و جوی ما پیچیده تر شوند مثلا اگر تمامیه فیلم هایی را که در تاریخ انتشار مشخص و با ژانر خاصی هستند نیاز داشته باشید معمولا دوباره به ازای آن یک متد در ریپازیتوری مربوطه تعریف میکنید.
{
public IReadOnlyList<Movie> GetByReleaseDate(DateTime maxReleaseDate) { }
public IReadOnlyList<Movie> GetByRating(double minRating) { }
public IReadOnlyList<Movie> GetByGenre(string genre) { }
}
برای نوشتن این متد روش های زیادی وجود دارد مانند اکستنشن متد،یا یک متدی که به صورت جداگانه این فیلتر ها را بروی Dbset<Movie> اعمال کند. اما این راه حل ها راهای درستی نیستند و از جمله معیاب آن میتوان به نقض کردن اصل DRY میباشد چون بایستی به ازای هر Dbset این متد ها را که حتی ممکن است logic های یکسانی داشته باشند ، تکرار کنید.
اکنون شاید با خود میگویید خب میتوانیم از یک متد Generic برای جلوگیری از این تکرار استفاده کنیم .
راه حل این مشکل استفاده از الگوی specification است . اما با یک پیاده سازی خاص .در این پست دو پیاده سازی از این الگو ارائه خواهییم داد.
پیاده سازی اول یک پیاده سازی ساده با عنوان Naive implementation است.و در ادامه به سمت بهتر کردن ان پیش میرویم.
اولین راه حل برای مقابله با مشکل بالا (ایجاد متد های متعدد برای شاخص های متعدد در جست و جو و مرتب سازی و..) استفاده از امکان expressions در سی شارپ است تا حدی زیادی آنها خودشان هم یک پیاده سازی از الگوی specification هستند. پس میتوانید یک متد در ریپازیتوری خود بنویسیدکه به عنوان پارامتر یک expression ورودی بگیرد مثال :
// Controllerمشکلی که با این روش وجود دارد این است که با اینکه شروط مربوط به دامین مدل مان را در یک مکان واحد جمع اوری کردیم (در متغیر Expression) اما چنین متغیر هایی در این سطح (Controller) برای چنین اطلاعات مهمی اصلا مناسب نیستند.در این روش امکان دوباره استفاده از این شروط بسیار سخت میشود و حتی تمایل به duplicate در کل اپلیکیشن بشدت افزایش پیدا میکتد.و متاسفانه دوباره در نهایت به مشکل اول باز میگردیم.
public void SomeMethod()
{
Expression<Func<Movie, bool>> expression = m => m.MpaaRating == MpaaRating.G;
var movies = _repository.Find(expression); // Getting a list of movies
}
// Repository
public IReadOnlyList<Movie> Find(Expression<Func<Movie, bool>> expression)
{
return db
.Where(expression)
.ToList();
}
حال نوبت به یک پیاده سازیه ساده از الگوی Specification تحت عنوان GenericSpecification میرسد.
public class GenericSpecification<T>نحوه استفاده از آن در پست بعدی ...
{
public Expression<Func<T , bool>> Expression { get; }
public GenericSpecification(Expression<Func<T , bool>> expression)
{
Expression = expression;
}
public bool IsSatisfiedBy(T entity)
{
return Expression.Compile().Invoke(entity);
}
}
@fullStackDevs
Wikipedia
Don't repeat yourself
software development principle with the goal of reducing repetitive software patterns, and replacing them with abstractions that use data normalization to avoid redundancy
ادامه پست قبل :
🌀 Specification pattern
نحوه استفاده از آن
✔️ اما راهکار چیست؟
🔳 راه حل درست، استفاده از پیاده سازی ای از الگو specification تحت عنوان Strongly-typed specifications میباشد.
در این روش الگوی specification طوری پیاده سازی شده است که در آن اطلاعات دامین مدل نوشته شده و با کمترین امکان تغییر از خارج از کلاس پیاده سازی کننده پیاده سازی شده است. نحوه پیاده سازی :
لینک مطلب
@fullStackDevs
🌀 Specification pattern
نحوه استفاده از آن
// Controller🔹 اما در این روش هم باز همان مشکل قبل را داریم و کلاس جنریک specification در اینجا فقط به عنوان یک wrapper برروی expression قبلی مان عمل میکند پس نتیجه ای که میتوانیم بگیریم این است که GenericSpecification یک روش بد میباشد.چون فقط نقش یک Container را ایفا میکند که Client ها به اطلاعات خود را پاس میدهند و مشکل کپسوله سازی اطلاعات دامین مدل ها هنوز پا برجا و حل نشده باقی مانده است.
public void SomeMethod()
{
var specification = new GenericSpecification<Movie>(
m => m.MpaaRating == MpaaRating.G);
var movies = _repository.Find(specification); // Getting a list of movies
}
// Repository
public IReadOnlyList<Movie> Find(GenericSpecification<Movie> specification)
{
return db
.Where(specification.Expression)
.ToList();
}
✔️ اما راهکار چیست؟
🔳 راه حل درست، استفاده از پیاده سازی ای از الگو specification تحت عنوان Strongly-typed specifications میباشد.
در این روش الگوی specification طوری پیاده سازی شده است که در آن اطلاعات دامین مدل نوشته شده و با کمترین امکان تغییر از خارج از کلاس پیاده سازی کننده پیاده سازی شده است. نحوه پیاده سازی :
public abstract class Specification<T>🔸 در این روش باید به ازای هر شاخص یا عملگری که میخواهید به عنوان یک فیلتر بر روی DbSet انجام شود،باید کلاسی تعریف کنید که از ابستراکت کلاس Specification<T> ارث بری کرده و متد ToExpression() انرا override و پیاده سازی کند. مثلا در مثال بالا ما به ازای شاخص MpaaRating که یک enum در کلاس Movie بود .یک کلاس با نام MpaaRatingAtMostSpecification ایجاد کردیم که از ابستراکت کلاس Specification<T> ارث بری کرده و با override کردن ToExpression() و پیاده سازی آن به صورت :
{
public abstract Expression<Func<T , bool>> ToExpression();
public bool IsSatisfiedBy(T entity)
{
Func<T , bool> predicate = ToExpression().Compile();
return predicate(entity);
}
}
public class MpaaRatingAtMostSpecification : Specification<Movie>
{
private readonly MpaaRating_rating;
public MpaaRatingAtMostSpecification(MpaaRating rating)
{
_rating = rating;
}
public override Expression<Func<Movie, bool>> ToExpression()
{
return movie => movie.MpaaRating <= _rating;
}
}
// Controller
public void SomeMethod()
{
var gRating = new MpaaRatingAtMostSpecification(MpaaRating.G);
IReadOnlyList<Movie> movies = repository.Find(gRating); // Getting a list of movies
}
// Repository
public IReadOnlyList<T> Find(Specification<T> specification)
{
return db.Where(specification.ToExpression()).ToList();
}
}
public override Expression<Func<Movie, bool>> ToExpression()شرط خود را نوشته و در سطح کنترلر اگر نیاز به فیلتر Movie ها بر اساس شاخص MpaaRating داشتیم با نمونه سازی از این کلاس به صورت :
{
return movie => movie.MpaaRating <= _rating;
}
var gRating = new MpaaRatingAtMostSpecification(MpaaRating.G);آنرا بر روی Dbset<Movie> اعمال کنیم.پس اگر قرار باشد فیلتری براساس شاخص یا عملگر دیگری اعمال کنید باید یک کلاس جدیدبسازید که از ابستراکت کلاس Specification<T> ارث بری میکند و با پیاده سازی متد ToExpression() شرط مورد نظر خود بنویسید.
IReadOnlyList<Movie> movies = repository.Find(gRating); // Getting a list of movies
و پاس دادن آن به متد Find ریپازیتوری خودمان :
// Repository
public IReadOnlyList<T> Find(Specification<T> specification)
{
return db.Where(specification.ToExpression())
.ToList();
}
لینک مطلب
@fullStackDevs
Telegram
Web Devs
🌀 Specification pattern: C# implementation
در این پست به معرفی الگوی Specification میپردازیم و یک مثال فوق العده کاربردی ارائه میدهیم که یک گام معماری و کدتان به Domain Driven Design و Clean Code نزدیکتر میکند.
*توضیحات تکمیلی : این پست را بهتر است با…
در این پست به معرفی الگوی Specification میپردازیم و یک مثال فوق العده کاربردی ارائه میدهیم که یک گام معماری و کدتان به Domain Driven Design و Clean Code نزدیکتر میکند.
*توضیحات تکمیلی : این پست را بهتر است با…
#OAuth
🌀OAuth authorization
🔹 در این پست می آموزیم که OAuth چیست.
درابتدا باید بدانیم که OAuth مخفف Open Authorization میباشد.
OAuth
🔸 یک پروتکل برای اهدای مجوز برای دسترسی به اطلاعات کاربر توسط اپلیکیشنی دیگر است.
این پروتکل ابتدا در سال 2007 معرفی شد و توسط توییتر استفاده شد و با توجه به استقبال و گستردگی ان در سال 2010 نسخه OAuth 2.0 توسط IEFT (جامعه بین المللی آزاد از طراحان شبکه ، اپراتورها ، فروشندگان و محققانی است که بر روی تدوین استانداردهای فنی برای اینترنت کار می کنند.) معرفی شد.
🔻 برای مثال ممکن است موقع ثبت نام در سایتی گزینه هایی همچون “login with Google” یا “login with Facebook” را دیده باشید که عملیات login را بسیار ساده میکند و با اعطای مجوز دسترسی به اطلاعاتتان به سایتی که میخواهید در آن حساب بسازید عملیات ورود و ساخت حساب را انجام میدهید.
✔️ سه اجزایی که در یک مکانیزم OAuth وجود دارند عبارتند از :
1️⃣ OAuth Provider , Resource Provider
سرویسی که با دریافت تاییدیه امکان استفاده از اطلاعات کاربر را به یک اپلیکیشن دیگر میدهد. مانند گوگل ، فیس بوک و... که بایستی پروتکل OAuth ار پیاده سازی کرده باشد.
2️⃣ OAuth Client
وب سایت یا اپلیکیشنی که اجزای دسترسی به اطلاعاتمان را به آن میدهیم.
3️⃣ Resource Owner
شخصی که اطلاعات آن در اختیار Resource Provider است.
طی این فرایند شما با اعطای مجوز به OAuth Client و دریافت یک access token این امکان را به OAuth Client میدهید که به اطلاعات شما از طریق آن access token دسترسی داشته باشد .
@fullStackDevs
🌀OAuth authorization
🔹 در این پست می آموزیم که OAuth چیست.
درابتدا باید بدانیم که OAuth مخفف Open Authorization میباشد.
OAuth
🔸 یک پروتکل برای اهدای مجوز برای دسترسی به اطلاعات کاربر توسط اپلیکیشنی دیگر است.
این پروتکل ابتدا در سال 2007 معرفی شد و توسط توییتر استفاده شد و با توجه به استقبال و گستردگی ان در سال 2010 نسخه OAuth 2.0 توسط IEFT (جامعه بین المللی آزاد از طراحان شبکه ، اپراتورها ، فروشندگان و محققانی است که بر روی تدوین استانداردهای فنی برای اینترنت کار می کنند.) معرفی شد.
🔻 برای مثال ممکن است موقع ثبت نام در سایتی گزینه هایی همچون “login with Google” یا “login with Facebook” را دیده باشید که عملیات login را بسیار ساده میکند و با اعطای مجوز دسترسی به اطلاعاتتان به سایتی که میخواهید در آن حساب بسازید عملیات ورود و ساخت حساب را انجام میدهید.
✔️ سه اجزایی که در یک مکانیزم OAuth وجود دارند عبارتند از :
1️⃣ OAuth Provider , Resource Provider
سرویسی که با دریافت تاییدیه امکان استفاده از اطلاعات کاربر را به یک اپلیکیشن دیگر میدهد. مانند گوگل ، فیس بوک و... که بایستی پروتکل OAuth ار پیاده سازی کرده باشد.
2️⃣ OAuth Client
وب سایت یا اپلیکیشنی که اجزای دسترسی به اطلاعاتمان را به آن میدهیم.
3️⃣ Resource Owner
شخصی که اطلاعات آن در اختیار Resource Provider است.
طی این فرایند شما با اعطای مجوز به OAuth Client و دریافت یک access token این امکان را به OAuth Client میدهید که به اطلاعات شما از طریق آن access token دسترسی داشته باشد .
@fullStackDevs
Web Devs
🌀 Specification pattern: C# implementation در این پست به معرفی الگوی Specification میپردازیم و یک مثال فوق العده کاربردی ارائه میدهیم که یک گام معماری و کدتان به Domain Driven Design و Clean Code نزدیکتر میکند. *توضیحات تکمیلی : این پست را بهتر است با تلگرام…
#LinqBuilder
#SpecificationPattern
LinqBuilder takes advantage of the specification pattern for filtering and ordering of LINQ queries.
LinqBuilder is based on the specification pattern.
Github
NuGet Packages :
https://www.nuget.org/packages?q=linqbuilder
@fullStackDevs
#SpecificationPattern
LinqBuilder takes advantage of the specification pattern for filtering and ordering of LINQ queries.
LinqBuilder is based on the specification pattern.
Github
NuGet Packages :
https://www.nuget.org/packages?q=linqbuilder
@fullStackDevs
#SVG
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم اندازه فایل را کم نگه داریم. برای رسیدن به این هدف در مورد آیکون ها، لوگوها و ترسیمات ساده در سایت فقط یک راه وجود دارد.
➖ ما به عنوان طراح سایت میخواهیم که تصاویری داشته باشیم که به هر اندازه که بخواهیم بزرگشان کنیم و کیفیتشان از بین نرود که با SVG امکان پذیراست اما قبل تر با وجود مرورگرهای قدیمی ما را از استفاده از چنین قابلیتی دور نگه می داشت. اما خوشبختانه امروزه می توان از این قابلیت بهره برد.
➖ این بدین معنی نیست که در آینده نزدیک از تصاویری با فرمت های PNG، JPG و غیره دیگر استفاده نمی شود، نه، بلکه آنها همچنان کاربرد خود را در وب خواهند داشت و در کنار SVG به حیات خود در دنیای وب ادامه خواهند داد.
🔻 حالا SVG چیست؟
SVG (Scalable Vector Graphics)
در دنیای کامپیوتر ترسیمات می توانند از دو نوع Raster یا Vector باشند.
➖ در Raster Graphics یا گرافیک شطرنجی تصویر به صورت مجموعه ای از پیکسلها ذخیره میشود و رنگ هر پیکسل به طور جداگانه ذخیره میشود. تغییر اندازه این تصاویر کیفیت آنها را تحث تاثیر قرار می دهد. اکثر فرمتهای رایج فایلهای تصویری مانند jpg، gif، و bmp بر مبنای گرافیک شطرنجی هستند.
➖ در Vector Graphics یا گرافیک برداری روشی در تولید و ذخیرهٔ فایلهای تصویری کامپیوتری است که در آن تصویر در قالب مجموعهای از مشخصات هندسی نقاط، خطها، منحنیها و چندضلعیها ذخیره میشود. واژهٔ «بردار» در این کاربرد معنایی وسیعتر از یک خط راست دارد.
➖ تصاویر تعریف شده به کمک گرافیک برداری، از خطوط و منحنیهایی به نام بردار تشکیل شدهاند که به صورت ریاضی تعریف میشوند. اجزای این تصاویر را میتوان بدون از دست دادن کیفیت به راحتی جا به جا کرد و تغییر اندازه داد.
➖ این تصاویر مستقل از رزولوشن هستند و میتوان آنها را بزرگ و کوچک کرد و در هر رزولوشن بدون از دست دادن جزئیات و وضوح چاپ کرد. یکی از شناخته شده ترین فرمتهای ذخیرهٔ فایلهای گرافیک برداری، فرمت SVG است.
➖ در SVG بر اساس XML است این یعنی سینتکس آن خیلی هم غریبه نخواهد بود و به HTML شباهت دارد. به این صورت که برای ترسیم شکل های مختلف تگ های مختلف وجود دارد مثلا برای ترسیم دایره از تگ
ادامه در پست بعدی ...
@fullStackDevs
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم اندازه فایل را کم نگه داریم. برای رسیدن به این هدف در مورد آیکون ها، لوگوها و ترسیمات ساده در سایت فقط یک راه وجود دارد.
➖ ما به عنوان طراح سایت میخواهیم که تصاویری داشته باشیم که به هر اندازه که بخواهیم بزرگشان کنیم و کیفیتشان از بین نرود که با SVG امکان پذیراست اما قبل تر با وجود مرورگرهای قدیمی ما را از استفاده از چنین قابلیتی دور نگه می داشت. اما خوشبختانه امروزه می توان از این قابلیت بهره برد.
➖ این بدین معنی نیست که در آینده نزدیک از تصاویری با فرمت های PNG، JPG و غیره دیگر استفاده نمی شود، نه، بلکه آنها همچنان کاربرد خود را در وب خواهند داشت و در کنار SVG به حیات خود در دنیای وب ادامه خواهند داد.
🔻 حالا SVG چیست؟
SVG (Scalable Vector Graphics)
در دنیای کامپیوتر ترسیمات می توانند از دو نوع Raster یا Vector باشند.
➖ در Raster Graphics یا گرافیک شطرنجی تصویر به صورت مجموعه ای از پیکسلها ذخیره میشود و رنگ هر پیکسل به طور جداگانه ذخیره میشود. تغییر اندازه این تصاویر کیفیت آنها را تحث تاثیر قرار می دهد. اکثر فرمتهای رایج فایلهای تصویری مانند jpg، gif، و bmp بر مبنای گرافیک شطرنجی هستند.
➖ در Vector Graphics یا گرافیک برداری روشی در تولید و ذخیرهٔ فایلهای تصویری کامپیوتری است که در آن تصویر در قالب مجموعهای از مشخصات هندسی نقاط، خطها، منحنیها و چندضلعیها ذخیره میشود. واژهٔ «بردار» در این کاربرد معنایی وسیعتر از یک خط راست دارد.
➖ تصاویر تعریف شده به کمک گرافیک برداری، از خطوط و منحنیهایی به نام بردار تشکیل شدهاند که به صورت ریاضی تعریف میشوند. اجزای این تصاویر را میتوان بدون از دست دادن کیفیت به راحتی جا به جا کرد و تغییر اندازه داد.
➖ این تصاویر مستقل از رزولوشن هستند و میتوان آنها را بزرگ و کوچک کرد و در هر رزولوشن بدون از دست دادن جزئیات و وضوح چاپ کرد. یکی از شناخته شده ترین فرمتهای ذخیرهٔ فایلهای گرافیک برداری، فرمت SVG است.
➖ در SVG بر اساس XML است این یعنی سینتکس آن خیلی هم غریبه نخواهد بود و به HTML شباهت دارد. به این صورت که برای ترسیم شکل های مختلف تگ های مختلف وجود دارد مثلا برای ترسیم دایره از تگ
<circle/>استفاده می شود و در نهایت همه اشکال، درون یک تگ
<svg />قرار می گیرند.
ادامه در پست بعدی ...
@fullStackDevs
Wikipedia
گرافیک شطرنجی
نگاشتار شطرنجی یا گرافیک شطرنجی (به انگلیسی: Raster Graphics) روشی از گرافیک است که به وسیله تقسیم کردن تصویر به چهارخانههای کوچک یا عناصر کوچک تصویر که پیکسل نام دارند ساخته میشود. پیکسلها، محتوای اطلاعاتی مثل حافظ، کنترل شفافیت و رنگ میباشند. این اطلاعات…
ادامه پست قبل
🔻 چرا SVG ؟
🔹 مستقل از رزولوشن
یکی از نقاط قوت SVG این است که در صفحه نمایش هایی با کیفیت بسیار بالا هم به بهترین شکل نمایش داده می شود و کیفیتش تغییر نمی کند. برخلاف تصاویر Raster که کیفیت خود را از دست می دهند و مجبوریم برای صفحه نمایش هایی با کیفیت بالاتر نسخه با کیفیت تری از تصویر را نمایش دهیم.
دیگر مهم نیست اندازه تصویر چه باشد، یا چقدر کاربر Zoom کند و یا اینکه کیفیت صفحه نمایش کاربر چه اندازه باشد. در همه این موارد SVG قصه ما همان حالت با کیفیت و تیزش را حفظ می کند.
🔸 سازگار با CSS
از اونجایی که SVG هم مثل HTML یک markup است می تواند Class یا css داشته باشد و از آن طریق در css می تواند در دسترس باشد.
پس می توانیم روی ترسیمات برداری از طریق css کارهای زیادی انجام دهیم که این کار برای ترسیمات Raster امکان پذیر نمی باشد.
فرض کنید مستطیلی را از طریق SVG ساخته ایم می توانیم رنگ آن را بصورت های مختلف تغییر دهیم ولی اگر همان مستطیل از نوع تصاویر معمولی مثلا با فرمت PNG بود می توان گفت دیگر این امکان برای ما وجود نداشت.
🔹 تعامل پذیری ساده از طریق Javascript
به همان دلیلی که SVG با CSS سازگار است می توان گفت که به راحتی می توان از طریق جاواسکریپت با آن تعامل داشت و مواردی مثل انیمیشن و غیره را به راحتی پیاده و در نتیجه تجربه کاربری و تعاملی خوبی را به سادگی برای کاربر مهیا کرد.
🔸 درخواست HTTP کمتر
هر زمان که بواسطه تگ <img> از تصویری به صورت عادی در یک صفحه وب استفاده کنید مرورگر برای ترسیم آن تصویر یک درخواست HTTP به سرور می فرستد تا تصویر را از سرور گرفته و نمایش دهد. اگر از روش خطی برای SVG استفاده کنیم SVG بصورت مستقیم در فایل HTML قرار دارد و دیگر نیازی به یک درخواست جداگانه برای تصویر ما نخواهد بود.
🔹 ویرایش ساده
برای تغییر یک فایل SVG فقط به یک ویرایشگر متن نیاز داریم این یعنی در همان محیط کدنویسی می توانیم ویراش مورد نظرمان را انجام دهیم. اما اگر یک تصویر Raster را بخواهیم ویرایش کنیم باید به فوتوشاب یا مشابه آن پناه ببریم.
🔸 حجم فایل کمتر
ترسیمات وکتور معمولا حجم کمتری را می گیرند مخصوصا اگر شکل و طرح ساده ای داشته باشند. پس فایل تصویر ما سایز کمتری خواهد داشت. همچنین فشرده سازی بصورت بهتری روی SVG اعمال می شود. پس می توان از نظر سایز صفحه وب هم با استفاده از SVG صرفه جویی داشته باشیم که از نظر کارایی کمک بسیار خوبی برای سایت ما خواهد بود.
🔹طراحی واکنشگرا
اگر تصویر شما می تواند بصورت SVG باشد دیگر نگرانی برای واکنشگرا بودن آن نخواهید داشت. ولی در صورت استفاده از تصاویری با فرمت PNG یا JPG شاید مجبور شوید تا در صفحه نمایش های مختلف نسخه های مختلفی از آن تصاویر را قرار دهید.
✔️ بهترین موارد استفاده SVG :
▪️ آیکون ها
▫️ ترسیمات ساده مثل شکل های مختلف
▪️ بنرهای تبلیغاتی
▫️ ترسیمات متحرک
▪️ اینفوگراف ها و مصورسازی داده ها
می باشند.
🌀 واضح است که اگر تصویری از یک منظره داشته باشیم که توسط یک عکاس گرفته شده است، نمایش آن بوسیله SVG منطقی نخواهد بود چرا که در این مورد حجم فایل به مراتب بیشتر از فرمت PNG یا JPG خواهد بود.
@fullStackDevs
🔻 چرا SVG ؟
🔹 مستقل از رزولوشن
یکی از نقاط قوت SVG این است که در صفحه نمایش هایی با کیفیت بسیار بالا هم به بهترین شکل نمایش داده می شود و کیفیتش تغییر نمی کند. برخلاف تصاویر Raster که کیفیت خود را از دست می دهند و مجبوریم برای صفحه نمایش هایی با کیفیت بالاتر نسخه با کیفیت تری از تصویر را نمایش دهیم.
دیگر مهم نیست اندازه تصویر چه باشد، یا چقدر کاربر Zoom کند و یا اینکه کیفیت صفحه نمایش کاربر چه اندازه باشد. در همه این موارد SVG قصه ما همان حالت با کیفیت و تیزش را حفظ می کند.
🔸 سازگار با CSS
از اونجایی که SVG هم مثل HTML یک markup است می تواند Class یا css داشته باشد و از آن طریق در css می تواند در دسترس باشد.
پس می توانیم روی ترسیمات برداری از طریق css کارهای زیادی انجام دهیم که این کار برای ترسیمات Raster امکان پذیر نمی باشد.
فرض کنید مستطیلی را از طریق SVG ساخته ایم می توانیم رنگ آن را بصورت های مختلف تغییر دهیم ولی اگر همان مستطیل از نوع تصاویر معمولی مثلا با فرمت PNG بود می توان گفت دیگر این امکان برای ما وجود نداشت.
🔹 تعامل پذیری ساده از طریق Javascript
به همان دلیلی که SVG با CSS سازگار است می توان گفت که به راحتی می توان از طریق جاواسکریپت با آن تعامل داشت و مواردی مثل انیمیشن و غیره را به راحتی پیاده و در نتیجه تجربه کاربری و تعاملی خوبی را به سادگی برای کاربر مهیا کرد.
🔸 درخواست HTTP کمتر
هر زمان که بواسطه تگ <img> از تصویری به صورت عادی در یک صفحه وب استفاده کنید مرورگر برای ترسیم آن تصویر یک درخواست HTTP به سرور می فرستد تا تصویر را از سرور گرفته و نمایش دهد. اگر از روش خطی برای SVG استفاده کنیم SVG بصورت مستقیم در فایل HTML قرار دارد و دیگر نیازی به یک درخواست جداگانه برای تصویر ما نخواهد بود.
🔹 ویرایش ساده
برای تغییر یک فایل SVG فقط به یک ویرایشگر متن نیاز داریم این یعنی در همان محیط کدنویسی می توانیم ویراش مورد نظرمان را انجام دهیم. اما اگر یک تصویر Raster را بخواهیم ویرایش کنیم باید به فوتوشاب یا مشابه آن پناه ببریم.
🔸 حجم فایل کمتر
ترسیمات وکتور معمولا حجم کمتری را می گیرند مخصوصا اگر شکل و طرح ساده ای داشته باشند. پس فایل تصویر ما سایز کمتری خواهد داشت. همچنین فشرده سازی بصورت بهتری روی SVG اعمال می شود. پس می توان از نظر سایز صفحه وب هم با استفاده از SVG صرفه جویی داشته باشیم که از نظر کارایی کمک بسیار خوبی برای سایت ما خواهد بود.
🔹طراحی واکنشگرا
اگر تصویر شما می تواند بصورت SVG باشد دیگر نگرانی برای واکنشگرا بودن آن نخواهید داشت. ولی در صورت استفاده از تصاویری با فرمت PNG یا JPG شاید مجبور شوید تا در صفحه نمایش های مختلف نسخه های مختلفی از آن تصاویر را قرار دهید.
✔️ بهترین موارد استفاده SVG :
▪️ آیکون ها
▫️ ترسیمات ساده مثل شکل های مختلف
▪️ بنرهای تبلیغاتی
▫️ ترسیمات متحرک
▪️ اینفوگراف ها و مصورسازی داده ها
می باشند.
🌀 واضح است که اگر تصویری از یک منظره داشته باشیم که توسط یک عکاس گرفته شده است، نمایش آن بوسیله SVG منطقی نخواهد بود چرا که در این مورد حجم فایل به مراتب بیشتر از فرمت PNG یا JPG خواهد بود.
@fullStackDevs
Telegram
Web Devs
#SVG
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم…
#ScalableVectorGraphics
🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟
ما می خواهیم تا همه تصاویر و ترسیمات در سایت هایی که خلق می کنیم به بهترین، زیباترین، و با کیفیت ترین حالت ممکن قابل مشاهده باشند. همچنین بدلیل Performance و یا همان کارایی می خواهیم…
Forwarded from Web Devs
#DesignPatterns
در مهندسی نرم افزار الگو های طراحی یک راه حل عمومیه تکرار پذیر برای حل یک مشکل رایج در هنگام طراحی نرم افزار می باشد.
به عبارتی الگو های طراحی یک راه کار نهایی که به طور مستقیم میتوان انرا به کد تبدیل کرد نیست بلکه توضیح یا قالبی است برای اینکه ، چطور میتوان مشکلی که به راه های متفاوت پدیدار میشود را حل کرد.
الگو های طراحی روند سرعت توسعه نرم افزار را با ارائه روش های تست شده افزایش میدهند.
یک طراحی موثر و تاثیر گذاری نیازمند مسائلی است که ممکن است تا زمان پیاده سازی قابل رویت نباشد .
استفاده از الگوهای طراحی باعث جلوگیری از مسائل جرئی که بروز مشکلاتی بزرگ را دربر دارد، میشوند.
استفاده از الگوهای طراحی باعث میشود که کد شما قابل انعطاف تر و نگهداری آن آسان تر و همچنین راحتر بتوان دوباره از ان استفاده کرد و هیچ لزومی ندارد که همیشه این الگوهای طراحی را در پروژه های خود استفاده کنید ،الگوهای طراحی برای توسعه پروژه منظور نمی شوند بلکه برای حل مسائل متداول در نظر گرفته شده اند.هر وقت که به آنها نیاز داشتید بایستی الگوی مناسبی برای جلوگیری از بروز چنین مشکلی در آینده پیاده سازی کنید برای تشخیص اینکه برای چه مشکلی از چه الگویی استفاده کنید فقط باید سعی کنید که الگو های طراحی و مهم تر از ان هدف از هر الگو را درک کنید
الگوهای طراحی براساس هدف هر الگو به سه دسته تقسیم میشوند.
🔹Behavioural
🔸Creational
🔹Structural
1️⃣ Creational
این نوع الگو ها در مورد نحوه نمونه سازی از کلاس ها میباشند و انها را میتوان به class-creation و object-creational دسته بندی کرد.این به این معنی است که در زمان انجام Job و پیاده سازی الگو برای دسترسی به ویژگی های یک کلاس یا میتوان از طریق ارث بری از ویژگی های ان استفاده کرد یا اینکه با ساخت یک نمونه از کلاس هدف به ویژگی های ان نیز دسترسی داشت.
الگو های Creational عبارتند از :
این نوع از الگوها مربوط به سازماندهی کلاس ها و اشیاء مختلف برای تشکیل ساختارهای بزرگتر و ارائه قابلیت های جدید است.
الگو های Structural عبارتند از :
این نوع از الگو ها در مورد شناسایی الگوهای ارتباطی مشترک بین اشیاء و تحقق این الگوهاست دروافع الگوهای رفتاری آن الگوهایی هستند که به طور خاص به ارتباط بین اشیاء مربوط می شوند.
الگو های Behavioral عبارتند از :
💎 Acting out rather than speaking out became a pattern 💎
@fullStackDevs
در مهندسی نرم افزار الگو های طراحی یک راه حل عمومیه تکرار پذیر برای حل یک مشکل رایج در هنگام طراحی نرم افزار می باشد.
به عبارتی الگو های طراحی یک راه کار نهایی که به طور مستقیم میتوان انرا به کد تبدیل کرد نیست بلکه توضیح یا قالبی است برای اینکه ، چطور میتوان مشکلی که به راه های متفاوت پدیدار میشود را حل کرد.
الگو های طراحی روند سرعت توسعه نرم افزار را با ارائه روش های تست شده افزایش میدهند.
یک طراحی موثر و تاثیر گذاری نیازمند مسائلی است که ممکن است تا زمان پیاده سازی قابل رویت نباشد .
استفاده از الگوهای طراحی باعث جلوگیری از مسائل جرئی که بروز مشکلاتی بزرگ را دربر دارد، میشوند.
استفاده از الگوهای طراحی باعث میشود که کد شما قابل انعطاف تر و نگهداری آن آسان تر و همچنین راحتر بتوان دوباره از ان استفاده کرد و هیچ لزومی ندارد که همیشه این الگوهای طراحی را در پروژه های خود استفاده کنید ،الگوهای طراحی برای توسعه پروژه منظور نمی شوند بلکه برای حل مسائل متداول در نظر گرفته شده اند.هر وقت که به آنها نیاز داشتید بایستی الگوی مناسبی برای جلوگیری از بروز چنین مشکلی در آینده پیاده سازی کنید برای تشخیص اینکه برای چه مشکلی از چه الگویی استفاده کنید فقط باید سعی کنید که الگو های طراحی و مهم تر از ان هدف از هر الگو را درک کنید
الگوهای طراحی براساس هدف هر الگو به سه دسته تقسیم میشوند.
🔹Behavioural
🔸Creational
🔹Structural
1️⃣ Creational
این نوع الگو ها در مورد نحوه نمونه سازی از کلاس ها میباشند و انها را میتوان به class-creation و object-creational دسته بندی کرد.این به این معنی است که در زمان انجام Job و پیاده سازی الگو برای دسترسی به ویژگی های یک کلاس یا میتوان از طریق ارث بری از ویژگی های ان استفاده کرد یا اینکه با ساخت یک نمونه از کلاس هدف به ویژگی های ان نیز دسترسی داشت.
الگو های Creational عبارتند از :
Factory Method, Abstract Factory, Builder, Singleton, Object Pool, Prototype
2️⃣ Structuralاین نوع از الگوها مربوط به سازماندهی کلاس ها و اشیاء مختلف برای تشکیل ساختارهای بزرگتر و ارائه قابلیت های جدید است.
الگو های Structural عبارتند از :
Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Private Class Data, Proxy
3️⃣ Behavioralاین نوع از الگو ها در مورد شناسایی الگوهای ارتباطی مشترک بین اشیاء و تحقق این الگوهاست دروافع الگوهای رفتاری آن الگوهایی هستند که به طور خاص به ارتباط بین اشیاء مربوط می شوند.
الگو های Behavioral عبارتند از :
Command, Interpreter, Iterator, Mediator, Memento, Null Object, Observer, State, Strategy, Template method, Visitor
در ادامه نیز به بررسی این الگو ها میپردازیم.💎 Acting out rather than speaking out became a pattern 💎
@fullStackDevs
#Amaizing_DI_Libraries
#SimpleInjector
💫 SimpleInjector
یک DI Container بسیار ساده و قابل انعطاف که هدف آن سوق دادن توسعه دهنگان به سمت گود موفقیت میباشد.
پلترفرم هایی که توسط این لایبری ساپورت میشود :
▪️.NET 4.0 and up.
▪️ .NET Standard including:
▫️ Universal Windows Programs.
▫️ Mono.
▫️.NET Core.
▫️Xamarin.
🔸Simple Injector Integration libraries for AspNetCore
🔹
🔹
Simple injector nuget packages
Simple Injector on github
Simple Injector website & doc
📣 @fullStackDevs
#SimpleInjector
💫 SimpleInjector
یک DI Container بسیار ساده و قابل انعطاف که هدف آن سوق دادن توسعه دهنگان به سمت گود موفقیت میباشد.
پلترفرم هایی که توسط این لایبری ساپورت میشود :
▪️.NET 4.0 and up.
▪️ .NET Standard including:
▫️ Universal Windows Programs.
▫️ Mono.
▫️.NET Core.
▫️Xamarin.
🔸Simple Injector Integration libraries for AspNetCore
🔹
SimpleInjector.Integration.AspNetCore
🔹
SimpleInjector.Integration.AspNetCore.Mvc.Core
🔹SimpleInjector.Integration.AspNetCore.Mvc
All of the above available on nuget nowSimple injector nuget packages
Simple Injector on github
Simple Injector website & doc
📣 @fullStackDevs
کدام یک از دو موضوع زیر را به عنوان پست آتی کانال Web Devs ترجیح میدهید؟
Anonymous Poll
41%
1- الگوی MediatR چیست و نحوه پیاده سازی آن.
59%
2 - محل درست قرار گرفتن Caching در معماری پروژه ها و یک پیاده سازی اصولی از آن
Web Devs
کدام یک از دو موضوع زیر را به عنوان پست آتی کانال Web Devs ترجیح میدهید؟
با سلام خدمت اعضای محترم کانال Web Devs در مورد نظر سنجی اخیر کانال و توضیحاتی پیرامون آن جهت رفع شبهات.
در مورد گزینه یک منظور ما الگوی Mediator بوده است . و به دلیل تشابه اسمی بسیار نزدیک آن به کتابخانه MediatR و اشتباه تایپی پیش آمده در نظر سنجی در پست های آتی به معرفی این کتابخانه نیز میپردازیم.
با تشکر
@fullStackDevs
در مورد گزینه یک منظور ما الگوی Mediator بوده است . و به دلیل تشابه اسمی بسیار نزدیک آن به کتابخانه MediatR و اشتباه تایپی پیش آمده در نظر سنجی در پست های آتی به معرفی این کتابخانه نیز میپردازیم.
با تشکر
@fullStackDevs
Web Devs
#PersianDateTime #CSharp 🔹 ساختار تاریخ شمسی با متد های تبدیل به تاریخ میلادی و یا هجری 🔸 متدهای مختلف برای بدست آوردن رشته های مختلف تاریخ شمسی با فرمت های متفاوت و اعداد فارسی 🔹 پشتیبانی از سال کبیسه 🔸 شبیه سازی کامل ساختار DateTime .NetFramework 4.5 نصب…
#PersianDateTime
#CSharp
#NetStandard2.0
🔹 ساختار تاریخ شمسی با متد های تبدیل به تاریخ میلادی و یا هجری
.NetStandard 2.0
🔳 It is supported in .NET Core 2.0, in the .NET Framework 4.6.1 and later versions
نصب پکیج :
#CSharp
#NetStandard2.0
🔹 ساختار تاریخ شمسی با متد های تبدیل به تاریخ میلادی و یا هجری
.NetStandard 2.0
🔳 It is supported in .NET Core 2.0, in the .NET Framework 4.6.1 and later versions
نصب پکیج :
Install-Package ABluePersianDateTime -Version 2.0.2@fullStackDevs
dotnet add package ABluePersianDateTime --version 2.0.2
paket add ABluePersianDateTime --version 2.0.2
#ItemTemplate
🔻 در این پست می خواهیم یه تغییر کوچک در ItemTemplate های ویژال استادیو بدیم 🤔
💬 احتمالا بیشتر اوقات در هنگام کد نویسی درگیر این موضوع هستید و این مسئله جزئی شاید کمی اعصاب خرد کن نیز برای شما باشد.
همانطور که میدانید در هنگام افزودن یک کلاس از ItemTemplate های ویژال استادیو ، Access Modifier ای که کلاس دارد به صورت پیشفرض internal است البته این keyword از دید شما هاید(hide) بوده و کلاس به صورت زیر برای شما ساخته میشود.
🔸 در طول کدنویسی خیلی کمتر پیش می اید که یک کلاس را به صورت internal لازم داشته باشیم و عموما بعد از ساخت هر کلاس از جمله کار هایی که دائما انجام میدهیم تغییر Access Modifier ان به صورت public است.
☑️ حال میخواهیم با یک تغییر کوچک در itemTemplate های ویژال استادیو کاری کنیم که از این به بعد کلاس ها به طور پیشفرض به صورت پابلیک برای ما ساخته شوند.
این کار بسیار اسان است کافیست در مسیر هایی زیر که برای هر نسخه از ویژال استادیو مشخص شده است فایل class.cs را ویرایش کرده و کیوورد public را با یک فاصله قبل کلمه کلاس اضافه کنید به این شکل
☑️ از این به بعد خواهید دید که کلاس ساخته شده توسط ویژال استادیو برای شما به صورت پیشفرض public خواهد بود.
🔔 محل فایل class.cs برای هر نسخه از ویژال استادیو
VS2012 :
VS2015 :
VS2019 (Professional) :
@fullStackDevs
🔻 در این پست می خواهیم یه تغییر کوچک در ItemTemplate های ویژال استادیو بدیم 🤔
💬 احتمالا بیشتر اوقات در هنگام کد نویسی درگیر این موضوع هستید و این مسئله جزئی شاید کمی اعصاب خرد کن نیز برای شما باشد.
همانطور که میدانید در هنگام افزودن یک کلاس از ItemTemplate های ویژال استادیو ، Access Modifier ای که کلاس دارد به صورت پیشفرض internal است البته این keyword از دید شما هاید(hide) بوده و کلاس به صورت زیر برای شما ساخته میشود.
namespace WebDevs.Posts
{
class Class1
{
}
}
🔸 در طول کدنویسی خیلی کمتر پیش می اید که یک کلاس را به صورت internal لازم داشته باشیم و عموما بعد از ساخت هر کلاس از جمله کار هایی که دائما انجام میدهیم تغییر Access Modifier ان به صورت public است.
☑️ حال میخواهیم با یک تغییر کوچک در itemTemplate های ویژال استادیو کاری کنیم که از این به بعد کلاس ها به طور پیشفرض به صورت پابلیک برای ما ساخته شوند.
این کار بسیار اسان است کافیست در مسیر هایی زیر که برای هر نسخه از ویژال استادیو مشخص شده است فایل class.cs را ویرایش کرده و کیوورد public را با یک فاصله قبل کلمه کلاس اضافه کنید به این شکل
using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;
$if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks;
$endif$
namespace $rootnamespace$
{
public class $safeitemrootname$
{
}
}
☑️ از این به بعد خواهید دید که کلاس ساخته شده توسط ویژال استادیو برای شما به صورت پیشفرض public خواهد بود.
🔔 محل فایل class.cs برای هر نسخه از ویژال استادیو
VS2012 :
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class
VS2015 :
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class
VS2017(RC) : C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class
VS2017(Professional) : C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class
VS2019 (Enterprise) : C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs
VS2019 (Professional) :
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs
VS2019 (Preview) : C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\Common7\IDE\ItemTemplates\CSharp\Code\1033\Class\Class.cs
⚠️ توجه فرمایید که برای سایر نسخه ها نیز مسیر ها با ورژن های متناظر ذکر شده یکسان است . مثلا مسیر نسخه VS2017 community با VS2017 Professional یکسان است. برای سایرین نیز به همین شکل میباشد.@fullStackDevs
Forwarded from Code in Depth (ali yousefi ramand)
سلام دوستان
من علی یوسفی هستم و یه کانال زدم که توش مباحث مفهومی جاوااسکریپت رو به صورت طبقه بندی شده تدریس میکنم.
اگر دوست داشتید عضو بشید😉
@codeInDepth
من علی یوسفی هستم و یه کانال زدم که توش مباحث مفهومی جاوااسکریپت رو به صورت طبقه بندی شده تدریس میکنم.
اگر دوست داشتید عضو بشید😉
@codeInDepth
This media is not supported in your browser
VIEW IN TELEGRAM
#DesignModel
Design mode in google chrome!
در قسمت کنسول DevTools در کروم (F12) و وارد کردن دستور زیر در تب console اون صفحه قابل ویرایش خواهد شد .
@fullStackDevs
Design mode in google chrome!
در قسمت کنسول DevTools در کروم (F12) و وارد کردن دستور زیر در تب console اون صفحه قابل ویرایش خواهد شد .
@fullStackDevs
👍1
#Developers_Best_Practices
در این پست بهترین کار هایی که یک توسه دهنده میتونه انجام بده رو معرفی میکنیم.💡
همیشه به دنبال Best Practices برای برنامه ها و تکنولوژی هایی که استفاده میکنیم بودیم و گاها فراموش میکنیم که یک برنامه نویس خوب یه کد خوب می نویسه . نه اینکه یک کد خوب یه برنامه نویس خوب بسازه. این روند یه روند از بالا به پایینه پس تا خودتون رو بهبود نبخشین خروجی مهارت هاتون هم آنچنان تغییری نمیکنه .
💎 Practice
تمرین
اول بیایین یاد بگیریم اصلا تمرین چه معنی میده ؟
آیا تمرین یه رفتاره یا یه روند تکراریه یا کارهایی که لازم نیس روزانه دائما بخاطر داشته باشین که حتما انجامش بدین و طبق عادت انجام میشه.
تیراندازی، رانندگی و نوشتن
همه مهارت های ذکر شده حاصل تمرین هستش وقتی شروع به رانندگی میکنین باید هر محله شو به خاطر بسپارین و قبل انجام هر کاری فکر کنین اما به محض اینکه موفق به انجام یک رانندگی خوب شدین ،دیگه لازم نیس هی دائما مراحل رو حفظ کنین. چون تبدیل به یک عادت و یک امر عادی برای شما میشه.
توسعه نرم افزار هم با مهارت های ذکر شده تفاوتی نداره و برای اینکه به یک توسعه دهنده موفق تبدیل بشین باید و باید تمرین کنین.
❇️ Keep Reading Existing Software Source Code
آیا اصلا کد های نرم افزار ها یا کتابخونه های دیگه رو که به صورت متن باز منتشر میشن میخونین؟
فقط تعداد اندکی از توسعه دهنده ها پاسخ مثبت به این سوال میدن چون خوندن کدها کار کسل کننده ایه. اگر شما هم این کار رو یه کار کسل کننده میدونین و انجامش نمیدین باید بهتون بگم مهم ترین کاری که یک توسعه دهنده میتونه تو زندگیش انجام بده رو دارین از دست میدین. برای مثال اگه بخواین رمان نویس بشین .آیا در عین واحد میتونین شروع به نوشتن رمان کنین؟ قطعا پاسخ نه هست. برای اینکه یک رمان نویس خوب بنویسین اول باید صد ها رمان بخونین.
❇️ Complete your documents before next step
یکی از بدترین کارهایی که یک توسعه دهنده میتونه انجام بده مستقیم سراغ کد رفتنه . قبل از انجام هر کاری ابتدا دانسته ها و مستندات خودتون رو در مورد اون کار تکمیل کنین و بعد به سراغ مرحله کد نوشتن برین .قبل از استفاده از هر ابزاری یا تکنولوژی اول مستنداتش رو بخونین و تست هاشو ببینین. اگه غیر از این عمل کنین، در مرحله بعد خودتون رو داخل یک مشکل بزرگ پیدا میکنین. اینو همیشه سر لوحه کارتون قرار بدین که Documentation is the Key
فراموش نکنین که چیزهایی که امروز یاد میگیرن شمارو برای فردا اماده میکنه.
❇️ Follow the defined standards, don't create it
این نکته خیلی مهمه که همیشه سعی کنین از استاندارد هایی که توسط همه پذیرفته شده پیروی کنید و سعی نکنین دورباره اون هارو بسازین . این استاندارد ها توسط دولوپر هایی با سالها تجربه تنظیم و ساخته شده و پیروی کردن از این استاندارد ها مثل این میمونه که دارین پا تو ردپایه بزرگ اونها میذارین.
❇️ Code should be written to be reviewed
فراموش نکنین که کد باید طوری نوشته بشه تا توسط دیگران یا بعدا خودتون قابل بررسی باشه
سعی کنین بعد از اینکه کدی رو مینویسین حداقل یکبار خودتون مرورش کنین و به نوعی تو ذهنتون کامپایلش کنین اینجوری تا 90% مشکلاتی که وجود داره یا ممکنه وجود بیاد رو خودتون حل میکنین. بعد از تمام این مراحل از یه نفر بخاین که کد شمار رو بررسی کنه و از این بابت که داره ایرادات کد شمارو متذکر میشه بسیار خوشحال و سپاسگذار باشین.
بررسی شدن کدتون حتی اگه کدتون ضعیف باشه توسط دیگران به شما می اموزه که یک کد قوی بنویسین به شرط اینکه از نکاتش درس بگیرین و اون رو مثبت بشمارین.
هدفتون از کد نویسی ابتدا جلوگیری از باگ باشه و نوشتن یه کد بدون باگ. مثل Tester ها فک کنین و اینطور فک کردن و کد نوشتن برای کسی هم که کدتون رو تست میکنه میتونه یه چالش باشه.
❇️ Testing to be followed like a religion
به تست کردن کدتون مثل دینتون پایبند باشین.کدهاتونو بعد از هر تغییر بزرگ و کوچیکی تست کنین و اصلا به اینکه از زمانبندی تون عقب میوفتین اهمیت ندین
یادتون باشه موقع طراحی نرم افزار چیزی به نام "اعتماد" وجود نداره .
از اینکه باگ ها رو تو کدتون پیدا میکنین ناراحت نباشین و برعکس جشنش بگیرین و اصلا از اینکه Tester تو کدتون باگ پیدا میکنه ناراحت نباشین فراموش نکین که :
باگ ها دشمن شما هستن و باید اونارو بکشین و اشتباه ها تازمانی خوب ان که اونها رو تکرار نکنین.
❇️ Keep your Code and Documents Safe
یه توسعه دهنده باهوش عادت داره که از کارهای روزانش backup بگیره ازطرف دیگه اگه سیستمون crash کنه و به طریقی کدهاتون از بین بره درواقع اونی که crash کرده و از بین رفته شمایین.
پس نهایتا توصیه ای که میشه اینکه حتما از سورس کنترل ها استفاده کنین.
@fullStackDevs
در این پست بهترین کار هایی که یک توسه دهنده میتونه انجام بده رو معرفی میکنیم.💡
همیشه به دنبال Best Practices برای برنامه ها و تکنولوژی هایی که استفاده میکنیم بودیم و گاها فراموش میکنیم که یک برنامه نویس خوب یه کد خوب می نویسه . نه اینکه یک کد خوب یه برنامه نویس خوب بسازه. این روند یه روند از بالا به پایینه پس تا خودتون رو بهبود نبخشین خروجی مهارت هاتون هم آنچنان تغییری نمیکنه .
💎 Practice
تمرین
اول بیایین یاد بگیریم اصلا تمرین چه معنی میده ؟
آیا تمرین یه رفتاره یا یه روند تکراریه یا کارهایی که لازم نیس روزانه دائما بخاطر داشته باشین که حتما انجامش بدین و طبق عادت انجام میشه.
تیراندازی، رانندگی و نوشتن
همه مهارت های ذکر شده حاصل تمرین هستش وقتی شروع به رانندگی میکنین باید هر محله شو به خاطر بسپارین و قبل انجام هر کاری فکر کنین اما به محض اینکه موفق به انجام یک رانندگی خوب شدین ،دیگه لازم نیس هی دائما مراحل رو حفظ کنین. چون تبدیل به یک عادت و یک امر عادی برای شما میشه.
توسعه نرم افزار هم با مهارت های ذکر شده تفاوتی نداره و برای اینکه به یک توسعه دهنده موفق تبدیل بشین باید و باید تمرین کنین.
❇️ Keep Reading Existing Software Source Code
آیا اصلا کد های نرم افزار ها یا کتابخونه های دیگه رو که به صورت متن باز منتشر میشن میخونین؟
فقط تعداد اندکی از توسعه دهنده ها پاسخ مثبت به این سوال میدن چون خوندن کدها کار کسل کننده ایه. اگر شما هم این کار رو یه کار کسل کننده میدونین و انجامش نمیدین باید بهتون بگم مهم ترین کاری که یک توسعه دهنده میتونه تو زندگیش انجام بده رو دارین از دست میدین. برای مثال اگه بخواین رمان نویس بشین .آیا در عین واحد میتونین شروع به نوشتن رمان کنین؟ قطعا پاسخ نه هست. برای اینکه یک رمان نویس خوب بنویسین اول باید صد ها رمان بخونین.
❇️ Complete your documents before next step
یکی از بدترین کارهایی که یک توسعه دهنده میتونه انجام بده مستقیم سراغ کد رفتنه . قبل از انجام هر کاری ابتدا دانسته ها و مستندات خودتون رو در مورد اون کار تکمیل کنین و بعد به سراغ مرحله کد نوشتن برین .قبل از استفاده از هر ابزاری یا تکنولوژی اول مستنداتش رو بخونین و تست هاشو ببینین. اگه غیر از این عمل کنین، در مرحله بعد خودتون رو داخل یک مشکل بزرگ پیدا میکنین. اینو همیشه سر لوحه کارتون قرار بدین که Documentation is the Key
فراموش نکنین که چیزهایی که امروز یاد میگیرن شمارو برای فردا اماده میکنه.
❇️ Follow the defined standards, don't create it
این نکته خیلی مهمه که همیشه سعی کنین از استاندارد هایی که توسط همه پذیرفته شده پیروی کنید و سعی نکنین دورباره اون هارو بسازین . این استاندارد ها توسط دولوپر هایی با سالها تجربه تنظیم و ساخته شده و پیروی کردن از این استاندارد ها مثل این میمونه که دارین پا تو ردپایه بزرگ اونها میذارین.
❇️ Code should be written to be reviewed
فراموش نکنین که کد باید طوری نوشته بشه تا توسط دیگران یا بعدا خودتون قابل بررسی باشه
سعی کنین بعد از اینکه کدی رو مینویسین حداقل یکبار خودتون مرورش کنین و به نوعی تو ذهنتون کامپایلش کنین اینجوری تا 90% مشکلاتی که وجود داره یا ممکنه وجود بیاد رو خودتون حل میکنین. بعد از تمام این مراحل از یه نفر بخاین که کد شمار رو بررسی کنه و از این بابت که داره ایرادات کد شمارو متذکر میشه بسیار خوشحال و سپاسگذار باشین.
بررسی شدن کدتون حتی اگه کدتون ضعیف باشه توسط دیگران به شما می اموزه که یک کد قوی بنویسین به شرط اینکه از نکاتش درس بگیرین و اون رو مثبت بشمارین.
هدفتون از کد نویسی ابتدا جلوگیری از باگ باشه و نوشتن یه کد بدون باگ. مثل Tester ها فک کنین و اینطور فک کردن و کد نوشتن برای کسی هم که کدتون رو تست میکنه میتونه یه چالش باشه.
❇️ Testing to be followed like a religion
به تست کردن کدتون مثل دینتون پایبند باشین.کدهاتونو بعد از هر تغییر بزرگ و کوچیکی تست کنین و اصلا به اینکه از زمانبندی تون عقب میوفتین اهمیت ندین
یادتون باشه موقع طراحی نرم افزار چیزی به نام "اعتماد" وجود نداره .
از اینکه باگ ها رو تو کدتون پیدا میکنین ناراحت نباشین و برعکس جشنش بگیرین و اصلا از اینکه Tester تو کدتون باگ پیدا میکنه ناراحت نباشین فراموش نکین که :
باگ ها دشمن شما هستن و باید اونارو بکشین و اشتباه ها تازمانی خوب ان که اونها رو تکرار نکنین.
❇️ Keep your Code and Documents Safe
یه توسعه دهنده باهوش عادت داره که از کارهای روزانش backup بگیره ازطرف دیگه اگه سیستمون crash کنه و به طریقی کدهاتون از بین بره درواقع اونی که crash کرده و از بین رفته شمایین.
پس نهایتا توصیه ای که میشه اینکه حتما از سورس کنترل ها استفاده کنین.
@fullStackDevs
#Free
#tools
Remove Image Background
🧩ابزاری رایگان برای حذف Background
فقط کافیه تصویر مورد نظرتون را آپلود کنید !
📌 www.remove.bg
@fullStackDevs
#tools
Remove Image Background
🧩ابزاری رایگان برای حذف Background
فقط کافیه تصویر مورد نظرتون را آپلود کنید !
📌 www.remove.bg
@fullStackDevs
#gRPC
🔸 یک بررسی ساده و مفید از پروتکل gRPC
برای اینکه بدانیم gRPC چیست ابتدا باید با rpc و Protocol Buffers اشنایی داشته باشیم .
1️⃣ RPC
مخفف Remote Procedure Call می باشد و همچنین به عنوان subroutine call و function call نیز شناخته میشود.
در واقع RPC پروتکلی هست که یک برنامه می تواند با استفاده از ان به یک برنامه که در کامپیوتری دیگر واقع شده است بدون اینکه اطلاعاتی در مورد شبکه داشته باشد درخواست ارسال کند.
از این پروتکل در شبکه های client-server استفاده میشود.
یک درخواست RPC یک عملیات synchronous است و برنامه درخواست دهنده تا زمانی که سرور درخواستش را پردازش و نتیجه را بازگرداند منتظر مانده و block میشود.
2️⃣ Protocol Buffers
پروتکل بافر که protobuf هم گفته میشود یک روش سریالیزه کردن اطلاعات است که توسط گوگل برای استفاده داخلی توسعه یافته بود که بعداً برای استفاده عموم منتشر شد. از این روش برای برقرار کردن ارتباطات بین برنامهها توسط سیم یا ذخیره کردن اطلاعات استفاده میشود. این روش شامل یک زبان توصیف میانی و یک کامپایلر که کدهای مختلف برای زبانهای برنامهنویسی مختلف از این زبان توصیف میانی تولید میکند، است.
در ابتدای ارائه توسط "گوگل"، کامپایلر آن فقط برای زبانهای C++، جاوا و پایتون، کد تولید میکرد ولی توسط اشخاص ثالث، برای خیل بیشتر زبانهای دیگر هم ابزارهایی ارائه شده است.
❇️ grpc
حال که با این مفاهیم اشنا شدیم نوبت به gRPC میرسد.gRPC یک پروتکلی است که هر دوی این ها را پیاده ساری کرده و ویژگی اصلی ان این است که زبان های برنامه نویسی زیادی را پشتیبانی میکند. و اپلیکیشن ها براساس معماری TCP client-server با این پروتکل با هم ارتباط برقرار میکنند.
این به این معنی است که سرور endpoint های مشخصی را تعریف میکند که توسط هر client ای که قادر است از طریق TCP protocol با سرور ارتباط برقرار کند صدا زده میشود و شما میتوانید همانند REST به این endpoint ها فک کنید و رابط هایی برای سرور برای کار کردن با انها فراهم بیاورید.
پروتکل های زیادی هستند که چنین امکانات و ارتباطاتی را ممکن میسازند اما gRPC ویزگی هایی را به ارمغان می اورد که دیگر پروتکل ها ندارند.
1. این پروتکل در داخل گوگل استفاده میشود پس مراحل تست های خود را دیگر گذرانده است.
2. از انجایی که پیام ها به صورت باینری تبادل میشوند بنابراین به پهنای باند کمتر نسبت به جیسون و ایکس ام ال دارید.
3. جی آر سی پی بسیار پرطرفدار است و لایبری های زیادی برای تعداد زیادی زبان برنامه نویسی وجود دارد تا از آن استفاده کنید.
4. محبوبیت زیاد مستندات خوب و همچنین انجمن هایی را به وجود می اورد که شما را میتواند در کار کردن با ان کمک کند.
@fullStackDevs
🔸 یک بررسی ساده و مفید از پروتکل gRPC
برای اینکه بدانیم gRPC چیست ابتدا باید با rpc و Protocol Buffers اشنایی داشته باشیم .
1️⃣ RPC
مخفف Remote Procedure Call می باشد و همچنین به عنوان subroutine call و function call نیز شناخته میشود.
در واقع RPC پروتکلی هست که یک برنامه می تواند با استفاده از ان به یک برنامه که در کامپیوتری دیگر واقع شده است بدون اینکه اطلاعاتی در مورد شبکه داشته باشد درخواست ارسال کند.
از این پروتکل در شبکه های client-server استفاده میشود.
یک درخواست RPC یک عملیات synchronous است و برنامه درخواست دهنده تا زمانی که سرور درخواستش را پردازش و نتیجه را بازگرداند منتظر مانده و block میشود.
2️⃣ Protocol Buffers
پروتکل بافر که protobuf هم گفته میشود یک روش سریالیزه کردن اطلاعات است که توسط گوگل برای استفاده داخلی توسعه یافته بود که بعداً برای استفاده عموم منتشر شد. از این روش برای برقرار کردن ارتباطات بین برنامهها توسط سیم یا ذخیره کردن اطلاعات استفاده میشود. این روش شامل یک زبان توصیف میانی و یک کامپایلر که کدهای مختلف برای زبانهای برنامهنویسی مختلف از این زبان توصیف میانی تولید میکند، است.
در ابتدای ارائه توسط "گوگل"، کامپایلر آن فقط برای زبانهای C++، جاوا و پایتون، کد تولید میکرد ولی توسط اشخاص ثالث، برای خیل بیشتر زبانهای دیگر هم ابزارهایی ارائه شده است.
❇️ grpc
حال که با این مفاهیم اشنا شدیم نوبت به gRPC میرسد.gRPC یک پروتکلی است که هر دوی این ها را پیاده ساری کرده و ویژگی اصلی ان این است که زبان های برنامه نویسی زیادی را پشتیبانی میکند. و اپلیکیشن ها براساس معماری TCP client-server با این پروتکل با هم ارتباط برقرار میکنند.
این به این معنی است که سرور endpoint های مشخصی را تعریف میکند که توسط هر client ای که قادر است از طریق TCP protocol با سرور ارتباط برقرار کند صدا زده میشود و شما میتوانید همانند REST به این endpoint ها فک کنید و رابط هایی برای سرور برای کار کردن با انها فراهم بیاورید.
پروتکل های زیادی هستند که چنین امکانات و ارتباطاتی را ممکن میسازند اما gRPC ویزگی هایی را به ارمغان می اورد که دیگر پروتکل ها ندارند.
1. این پروتکل در داخل گوگل استفاده میشود پس مراحل تست های خود را دیگر گذرانده است.
2. از انجایی که پیام ها به صورت باینری تبادل میشوند بنابراین به پهنای باند کمتر نسبت به جیسون و ایکس ام ال دارید.
3. جی آر سی پی بسیار پرطرفدار است و لایبری های زیادی برای تعداد زیادی زبان برنامه نویسی وجود دارد تا از آن استفاده کنید.
4. محبوبیت زیاد مستندات خوب و همچنین انجمن هایی را به وجود می اورد که شما را میتواند در کار کردن با ان کمک کند.
@fullStackDevs
Wikipedia
پروتکل بافرز
پروتکل بافرز، یک روش سریالیزه کردن اطلاعات است که توسط گوگل برای استفاده داخلی توسعه یافته بود که بعداً برای استفاده عموم منتشر شد. از این روش برای برقرار کردن ارتباطات بین برنامهها توسط سیم یا ذخیره کردن اطلاعات استفاده میشود. این روش شامل یک زبان توصیف…
👍2
#Xamarin
#Announcing
Xamarin Announcements from .NET Conf 2019
Today at .NET Conf 2019, we shared some exciting announcements for Xamarin and Visual Studio developers, including:
▫️ XAML Hot Reload for Xamarin.Forms:
Make changes to your XAML UI. See them reflected live on your emulator, simulator, or physical device.
▪️ Xamarin Hot Restart:
Test changes made to your app, including multi-file code edits, resources, and references, while using a much faster build and deploy cycle.
▫️ iOS 13 and Android 10:
Take advantage of the full power and performance of native platforms and APIs. Including iPadOS, dark mode, and foldable support.
Content link:
https://devblogs.microsoft.com/xamarin/xamarin-dotnet-conf-2019/
@fullStackDevs
Tutorial Links :
Xamarin 101: Part 1 - Introduction to Xamarin
Xamarin 101: Part 2 - Installing Xamarin
Xamarin 101: Part 3 - Solution Architecture
Xamarin 101: Part 4 - Building a Xamarin.Forms UI with XAML
Xamarin 101: Part 5 - Xamarin.Forms MVVM with XAML
Xamarin 101: Part 6 - Xamarin.Forms Navigation with XAML
Xamarin 101: Part 7 - Wrapping Up
@fullStackDevs
#Announcing
Xamarin Announcements from .NET Conf 2019
Today at .NET Conf 2019, we shared some exciting announcements for Xamarin and Visual Studio developers, including:
▫️ XAML Hot Reload for Xamarin.Forms:
Make changes to your XAML UI. See them reflected live on your emulator, simulator, or physical device.
▪️ Xamarin Hot Restart:
Test changes made to your app, including multi-file code edits, resources, and references, while using a much faster build and deploy cycle.
▫️ iOS 13 and Android 10:
Take advantage of the full power and performance of native platforms and APIs. Including iPadOS, dark mode, and foldable support.
Content link:
https://devblogs.microsoft.com/xamarin/xamarin-dotnet-conf-2019/
@fullStackDevs
Tutorial Links :
Xamarin 101: Part 1 - Introduction to Xamarin
Xamarin 101: Part 2 - Installing Xamarin
Xamarin 101: Part 3 - Solution Architecture
Xamarin 101: Part 4 - Building a Xamarin.Forms UI with XAML
Xamarin 101: Part 5 - Xamarin.Forms MVVM with XAML
Xamarin 101: Part 6 - Xamarin.Forms Navigation with XAML
Xamarin 101: Part 7 - Wrapping Up
@fullStackDevs
Xamarin Blog
Xamarin Announcements from .NET Conf 2019 | Xamarin Blog
.NET Conf 2019 announcements for Xamarin & Visual Studio developers that enable better performance and capabilities of iOS and Android apps.
#JS
#Blocks
Creating beautiful websites (UI) without writing code
A JSX-based page builder
⚠️ Currently under development
blocks-ui.com
Github
@fullStackDevs
#Blocks
Creating beautiful websites (UI) without writing code
A JSX-based page builder
⚠️ Currently under development
blocks-ui.com
Github
@fullStackDevs