راهنمای تولید DSL در کاتلین – به گویش معمولی
یکیاز امکانهای حقیقتاً اثر گذار کاتلین قابلیت و امکان ایجاد کرد DSL سفارشی میباشد. دراین نوشته ی علمی به نظارت شیوه ساخت و ساز طراحی اپلیکیشن در مشهد DSL در کاتلین میپردازیم. بدین مراد فقط به چهار چیز نیاز دارید:
نمادگذاری میانوندی
متدهای اکستنشن
لامبدا
لامبدا با گیرنده
به دنبال این مفاد را یک به یک نظارت می کنیم.
نمادگذاری میانوندی
کلیک فرمائید
در «نمادگذاری میانوندی» (Infix Notation) براکتها و نقطهها را حذف می کنیم:
1class Car {
2 fun drive(miles: Int) {
3 ...
4 }
5}
6val car = Car()
7car.drive(10) // normal stuff
کافی میباشد نمادگذاری میانوندی را قبل از اعلان روال اضافه کنیم تا شغل نماید:
1class Car {
2 infix fun drive(miles: Int) {
3 ...
4 }
5}
6val car = Car()
7car drive 10 // no brackets! no dots!
متدهای اکستنشن
با به کار گیری از متدهای اکستنشن میقدرت تابعهای نو را به هر کلاس سوای نیاز به ارثبری اضافه کرد.
1val name = "Ahmed Riz"
2name.shout() // won\'t compile as shout() is not part of String class
برای این که آن را فارغ از ارثبری تحت عنوان بخشی از کلاس String دربیاوریم، بایستی روال shout را فارغ از پیشوند String ساخت و ساز کنیم.
1fun String.shout() {
2 println("$this !") // this refers to the value of string itself
3}
4val name = "Ahmed Riz"
5name.shout() // works! and prints out: Ahmed Riz !
متدهای اکستنشن دامنه پروژهای دارا هستند. میقدرت از هر جایی باطن پروژه به آنان دسترسی داشت.
لامبدا
با به کارگیری از لامبداها میقدرت «لفظ ها تابعی» (function literals) را به تابعهای جايگاه فراتر فرستاد.
1// a higher order function
2fun process(value: Int, operation: (Int) -> Unit) {
3 operation(value)
4}
5// when calling, we can pass in a lambda expression
6process(10, { value -> println(value) })
7// and because it\'s the last param, we can extract it out
8// just to clean things up even further
9process(10) { value -> println(value) }
لامبدا با گیرنده
با به کار گیری از لامبدا به همپا گیرنده میقدرت لفظ ها تابعی را به تابعهای سکو فراتر ولی با نوع گیرنده فرستاد.
1// slight change to the previous higher order function
2// now instead of operation: (Int) -> Unit
3// we\'ll do operation: Int.() -> Unit
4// This makes Int the receiver type
5fun process(value: Int, operation: Int.() -> Unit) {
6 value.operation()
7}
8// usage now becomes
9process(10) { println(this) } // prints out: 10
مخلوط همگی موردها
دراین نصیب با شیوه ایجاد کرد یک DSL خاص که تنهاً به مراد اکران روش شغل تولید می گردد آشنا میشویم.
1val myProfile = "Ahmed Rizwan" profile {
2 age = 90
3 phone = "123 456 789"
4}
کد تبدیل آن به یک DSL دارای اعتبار به آسانی پایین میباشد:
1class Profile(
2 val name: String,
3 var age: Int? = null,
4 var phone: String? = null
5)
6
7infix fun String.profile(create: Profile.() -> Unit): Profile {
8 val profile = Profile(this)
9 profile.create()
10 return profile
11}
حرف آخری
به این ترتیب برنده شدیم یک DSL سفارشی در کاتلین ساخت کنیم. با این کهاین DSL ممکن میباشد در دنیای حقیقی چندان اثر گذار نباشد، البته امید واریم بدین ترتیب ایده خیر و خوبی از طرز استعمال از این امکانهای مختلف کاتلین برای تشکیل داد DSL سفارشی برای خودتان به دست آورده باشید.
راهنمای تولید DSL در کاتلین – به گویش معمولی
یکیاز امکانهای حقیقتاً اثر گذار کاتلین قابلیت و امکان ایجاد کرد DSL سفارشی میباشد. دراین نوشته ی علمی به نظارت شیوه ساخت و ساز طراحی اپلیکیشن در مشهد DSL در کاتلین میپردازیم. بدین مراد فقط به چهار چیز نیاز دارید:
نمادگذاری میانوندی
متدهای اکستنشن
لامبدا
لامبدا با گیرنده
به دنبال این مفاد را یک به یک نظارت می کنیم.
نمادگذاری میانوندی
کلیک فرمائید
در «نمادگذاری میانوندی» (Infix Notation) براکتها و نقطهها را حذف می کنیم:
1class Car {
2 fun drive(miles: Int) {
3 ...
4 }
5}
6val car = Car()
7car.drive(10) // normal stuff
کافی میباشد نمادگذاری میانوندی را قبل از اعلان روال اضافه کنیم تا شغل نماید:
1class Car {
2 infix fun drive(miles: Int) {
3 ...
4 }
5}
6val car = Car()
7car drive 10 // no brackets! no dots!
متدهای اکستنشن
با به کار گیری از متدهای اکستنشن میقدرت تابعهای نو را به هر کلاس سوای نیاز به ارثبری اضافه کرد.
1val name = "Ahmed Riz"
2name.shout() // won\'t compile as shout() is not part of String class
برای این که آن را فارغ از ارثبری تحت عنوان بخشی از کلاس String دربیاوریم، بایستی روال shout را فارغ از پیشوند String ساخت و ساز کنیم.
1fun String.shout() {
2 println("$this !") // this refers to the value of string itself
3}
4val name = "Ahmed Riz"
5name.shout() // works! and prints out: Ahmed Riz !
متدهای اکستنشن دامنه پروژهای دارا هستند. میقدرت از هر جایی باطن پروژه به آنان دسترسی داشت.
لامبدا
با به کارگیری از لامبداها میقدرت «لفظ ها تابعی» (function literals) را به تابعهای جايگاه فراتر فرستاد.
1// a higher order function
2fun process(value: Int, operation: (Int) -> Unit) {
3 operation(value)
4}
5// when calling, we can pass in a lambda expression
6process(10, { value -> println(value) })
7// and because it\'s the last param, we can extract it out
8// just to clean things up even further
9process(10) { value -> println(value) }
لامبدا با گیرنده
با به کار گیری از لامبدا به همپا گیرنده میقدرت لفظ ها تابعی را به تابعهای سکو فراتر ولی با نوع گیرنده فرستاد.
1// slight change to the previous higher order function
2// now instead of operation: (Int) -> Unit
3// we\'ll do operation: Int.() -> Unit
4// This makes Int the receiver type
5fun process(value: Int, operation: Int.() -> Unit) {
6 value.operation()
7}
8// usage now becomes
9process(10) { println(this) } // prints out: 10
مخلوط همگی موردها
دراین نصیب با شیوه ایجاد کرد یک DSL خاص که تنهاً به مراد اکران روش شغل تولید می گردد آشنا میشویم.
1val myProfile = "Ahmed Rizwan" profile {
2 age = 90
3 phone = "123 456 789"
4}
کد تبدیل آن به یک DSL دارای اعتبار به آسانی پایین میباشد:
1class Profile(
2 val name: String,
3 var age: Int? = null,
4 var phone: String? = null
5)
6
7infix fun String.profile(create: Profile.() -> Unit): Profile {
8 val profile = Profile(this)
9 profile.create()
10 return profile
11}
حرف آخری
به این ترتیب برنده شدیم یک DSL سفارشی در کاتلین ساخت کنیم. با این کهاین DSL ممکن میباشد در دنیای حقیقی چندان اثر گذار نباشد، البته امید واریم بدین ترتیب ایده خیر و خوبی از طرز استعمال از این امکانهای مختلف کاتلین برای تشکیل داد DSL سفارشی برای خودتان به دست آورده باشید.

کارداران اثر گذار بر CPC در تبلیغات