loading...

مرجع تخصصی بروزترین مقالات طراحی اپلیکیشن

بازدید : 14
دوشنبه 9 تير 1404 زمان : 16:07


درآمدزایی از تبلیغات داخل طرحی
درآمدزایی از تبلیغات باطن طرحی یکی متداول‌ترین طرز‌هایی میباشد که با استعمال از آن میتوانید درآمدزایی از نرم افزار داشته باشید؛ علاوه‌بر آن با اعمال تبلیغات، تمامی هزینه‌هایی که بابت پیاده سازی نرم افزار و ساخت‌و‌ساز آن صرف کردید، مدد می شود؛ به‌این شکل که شما بعداز بستن قراردادهای تبلیغاتی، اذن می‌دهید که تبلیغات در نرم افزار‌ به استفاده کننده اکران داده گردد؛ معیار درآمدی که از این طرز ممکن میباشد استحصال فرمائید، به طور کامل بستگی داراست به‌این که چه تعداد کاربرانی طراحی اپلیکیشن در مشهد روی این تبلیغات کلیک ‌نمایند.

پیشنهاد “پیاده سازی نرم افزار فروشگاهی“

تبلیغات باطن اپلیکیشن‌ای به 5 طریق گوناگون قابل ارائه میباشند:

Interstitial: این طرز معمولا به طور لحظاتی کوتاه در بازی‌ها به یوزرها اکران داده میشود که استفاده کننده قادر است پنجره آن را ببندد؛ درحقیقت درین طریق، تبلیغات به طور پاپ آپ‌های فول اسکرین ظواهر میگردند؛

Banner: درین طریق مخاطب به سادگی میتواند از نرم افزار به کار گیری نماید؛ چون در ذیل یا این که بالای شیت تلفن همراه، تبلیغات به استفاده کننده نماد داده میگردد؛

Native: طرز Native جزو طریق‌های تبلیغاتی میباشد هیچ‌سیرتکامل مزاحمتی برای مخاطب ساخت و ساز نمی‌نماید؛ این طریق بیشتر برای پیشرفت‌پذیری تولیدها یا این که برندها اجرا می شود؛

Video: تبلیغات به طور خود کار به مخاطب اکران داده میشود که معمولا میان 10 الی 30 ثانیه آنگاه نیز به اتمام میرسد.

درآمدزایی نرم افزار با پست الکترونیک مارکتینگ
برای درآمدزایی درین شیوه، یوزرها بعداز ورود به نرم افزار شما، آدرس اینترنتی خویش را وارد می‌نمایند؛ درنهایت بعد از توده‌آوری پست الکترونیک همه یوزرها، می توانید سرویس ها یا این که تولید ها خویش را از روش پست الکترونیک به مشتریان معرفی نمائید؛ اما برای ترغیب بیشتر یوزرها به وارد کردن نشانی اینترنتی می توانید از نکات زیر به کار گیری فرمائید:

ارائه پاداش یا این که امتیازی ویژه به مشتریان؛
ارائه کدهای تخفیف
به کار گیری از سبک کراد فاندینگ (Crowdfunding)
سبک کراد فاندینگ (Crowdfunding) یکی‌از دیگر از طریق‌های درآمدزایی از نرم افزار میباشد؛ درین طرز با به کارگیری از پلتفرم‌های زیادی که وجود دارااست، میتوانید نرم افزار خویش را به دفاع‌کنندگان معرفی نمایید تا تحت عنوان توسعه و گسترش نرم افزار، شما‌را دفاع نمایند.

مشاهده “ارزش پیاده سازی نرم افزار“

درآمدزایی از نرم افزار با نشر نرم‌افزار مبلغی
درآمدزایی از نرم افزار با تکثیر اپلیکیشن مبلغی به‌این معناست که شما قادر است برای به کار گیری از سرویس ها نرم افزار خویش، حق اشتراک درنظر بگیرید؛ به‌این شکل که یوزرها بعداز نصب و فعال سازی این اپ، به مقطع کوتاهی از تجهیزات نرم افزار به طور بدون پول به کارگیری نمایند؛ آن گاه پس از اتمام این مقطع محصور، با خرید حق اشتراک از تجهیزات نرم افزار منفعت‌مند شوند.

به کار گیری از سبک حامی مالی
یکی از دیگر از طریق‌هایی که می‌قدرت با استعمال از آن به درآمد متعددی دست پیدا کرد، به کار گیری از سبک حامی مالی میباشد؛ این طرز برای پیاده سازی نرم افزار منحصربه‌فرد که هنوز راه و روش‌‌اندازی نشده، طریق بسیار قابل قبولی میباشد.

درآمدزایی از نرم افزار با ادموب گوگل
با استعمال از پلتفرم ادموب گوگل که جزو پلتفرم‌های تبلیغاتی میباشد، می توانید تبلیغات خویش را در نرم افزار‌های ios و یا این که اندرویدی به مخاطب اکران دهید تا به درآمد بسیار متعددی برسید.

بازدید : 18
يکشنبه 8 تير 1404 زمان : 16:11


Interface
درین بحش با Interface کاتلین آشنا خوا‌هیم شد.
در Kotlin، این Interface دقیقاً شبیه جاوا 8 فعالیت می نماید، بدین مفهوم که می‌توانند مشمول طراحی روال و همینطور طراحی اپلیکیشن در مشهد اعلان متدهای abstract باشند.
یک Interface می‌تواند به وسیله یک کلاس به خواسته استعمال از همت تعریف‌و‌تمجید گردیده آن طراحی گردد.
کلیدی “interface” برای تعریف و تمجید یک Interface در Kotlin همانگونه که در کد ذیل آرم داده گردیده‌است به کارگیری میگردد.

interface ExampleInterface {
var myVar: String // abstract property
fun absMethod() // abstract method
fun sayHello() = "Hello there" // method with default implementation
}
COPY
در نمونه بالا، ما یک Interface به اسم “ExampleInterface” ساخت کرده‌ایم و در درون آن، تعدادی abstract properties و مشی را با هم داریم.
به تابعی با اسم () SayHello نگاه نمایید که یک سیاق implemented میباشد.

در نمونه پایین، Interface فوق را در یک کلاس طراحی خوا هیم کرد.

interface ExampleInterface {
var myVar: Int // abstract property
fun absMethod():String // abstract method

fun hello() {
println("Hello there, Welcome to manataz.Com!")
}
}
class InterfaceImp : ExampleInterface {
override var myVar: Int = 25
override fun absMethod() = "Happy Learning "
}
fun main(args: Array) {
val obj = InterfaceImp()
println("My Variable Value is = ${obj.myVar}")
print("Calling hello(): ")
obj.hello()

print("Message from the Website-- ")
println(obj.absMethod())
}
COPY
خروجی :

My Variable Value is = 25

! Calling hello (): Hello there, Welcome to manataz.Com

Message from the Website– Happy Learning

همان گونه که پیش از این بیان شد، کاتلین از تعدادی وراثت هواخواهی نمی نماید، با این درحال حاضر، به عبارتی چیز را می اقتدار با طراحی بیش تر از دو Interface در یک مجال به دست آورد.

در نمونه تحت دو اینترفیس تولید میکنیم و بعداً هر دو اینترفیس را در یک کلاس طراحی می‌کنیم.

interface A {
fun printMe() {
println(" method of interface A")
}
}
interface B {
fun printMeToo() {
println("I am another Method from interface B")
}
}

// implements two interfaces A and B
class multipleInterfaceExample: A, B

fun main(args: Array) {
val obj = multipleInterfaceExample()
obj.printMe()
obj.printMeToo()
}
COPY
در نمونه بالا، دو Interface مثال A، B تولید کرده‌ایم و در کلاسی به اسم “multipleInterfaceExample” دو اینترفیس که تا قبل از این اعلام گردیده بود را پیاده‌سازی کرده‌ایم.

خروجی :

method of interface A

I am another Method from interface B

Modifiers در کاتلین
Kotlin visibility modifiers لغات کلیدی می‌باشند که امکان مشاهده کلاس‌ها، شی ها، interface ، تولیدکننده‌ها، توابع و همینطور properties و Setters آن ها را گزینش می‌نمایند.
اگرچه اخذ‌کننده‌ها مدام visibility یکسانی با properties دارا‌هستند، براین اساس نمی‌توانیم visibility آنان را تهیه و تنظیم کنیم.

Setters توابعی می باشند که برای تهیه مقادیر properties به کار گیری میگردند، در حالی که تحت عنوان گیرنده ، توابعی می باشند که برای خریداری نمودن مقادیر آن properties به کارگیری میشوند.

چهار visibility modifiers در Kotlin وجود دارااست که عبارتند از :

public
private
protected
internal
شرایط پیش فرض public میباشد.
این modifiers را می‌قدرت در جای ‌های زیادی مانند هدر کلاس یا این که بادی متدها بهره مند شد.

بیایید به جزئیات این modifiers نگاه کنیم :

Public Modifier
از هرجا در فضای کاری پروژه قابل دسترسی میباشد.
در آحاد نمونه‌های قبل ما Modifier بیان نکرده‌ایم، از این رو، تمامی آن‌ها در محدوده همگانی می‌باشند.
در تحت مثالی برای فهم بیشتر طریق اعلان یک متغیر یا این که روال همگانی اورده شده میباشد.

class publicExample {
val i = 1

fun doSomething() {
}
}
COPY
در نمونه بالا، ما هیچ modifier را بیان نکرده ایم، به این ترتیب اسلوب و متغیری که در اینجا تمجید گردیده‌است، به صورت پیش فرض همگانی میباشند.
در صورتیکه چه نمونه بالا را می اقتدار با Public Modifier به صورت مصرح به طور ذیل نوشت :

public class publicExample {
public val i = 1

public fun doSomething() {
}
}
COPY
Private Modifier
کلاس ها، متدها، packages و بقیه properties را می اقتدار با یک Private Modifier ذکر کرد.
این Modifier دقیقاً معنای مخالف Public را دارااست که بدین مضمون‌ میباشد که یک عضو سری فارغ محدوده آن قابل دسترسی وجود ندارد.
زمانی که هر چیزی تحت عنوان Private اعلام شد، می‌قدرت آن را صرفا در محدوده بلافصل خویش در دسترس قرار بخشید.
برای مثال، یک پکیج محرمانه میتواند در آن پوشه خاص قابل دسترسی باشد.
یک کلاس یا این که رابط محرمانه صرفا بوسیله اعضای داده آن قابل دسترسی میباشد.

private class privateExample {
private val i = 1

private val doSomething() {
}
COPY
در نمونه بالا، کلاس privateExample تنها از باطن به عبارتی پوشه منبع قابل دسترسی میباشد و متغیر i و اسلوب doSomething تنها از باطن کلاس privateExample قابل دسترسی میباشد.

نمونه :

open class A() {
private val i = 1

fun doSomething(){
println("Inside doSomething" )
println("Value of i is $i" )
}
}
class B : A() {
fun printValue(){
doSomething()
// println("Value of i is $i" )
}
}

fun main(args: Array) {
val a = A()
val b = B()

b.printValue()
}
COPY
خروجی :

Inside doSomething

Value of i is 1

در اینجا ما نمی‌توانیم به متغیر i در کلاس B دسترسی پیدا کنیم، چون تحت عنوان Private تعریف‌و‌تمجید گردیده است، به‌این معنا که می‌قدرت در باطن کلاس به آن دسترسی داشت و خیر مکان دیگری.

بازدید : 20
پنجشنبه 5 تير 1404 زمان : 11:23


سرو صدا مصرف یاد در دوران کوتاه
سروصدا نشانه‌دهنده وجود ناپایداری میباشد و این مورد در زمینه ی مصرف خاطر در اندروید نیز صحت می‌نماید. هنگامی که‌این نوع از سر مشق را مراعات می کنیم، معمولاً تعداد متعددی اشیای پرهزینه ساخت گردیده‌اند و در حین چرخه قدمت کوتاهشان کنار طراحی اپلیکیشن در مشهد گذارده می شوند.


سر وصدا در مصرف خاطر
برای بازتولید این ایراد، نمونه Numerous GCs را در نرم افزار دمو انجام نمائید. در‌این نمونه از RecyclerView برای اکران دو تصویر bitmap به طور متناوب مصرف شده میباشد که تصویر تعالی‌خیس دارنده وضوح تصویر 1000 در 1000 پیکسل و تصویر خرد‌خیس دارنده وضوح 256 در 256 پیکسل میباشد. RecyclerView را اسکرول نمایید تا غوغا آشکار را در پروفایلر یاد ملاحظه کنید. همینطور تجربیات کاربری در نرم افزار تلفن همراه نماید می شوند.


RecyclerView نماید
1class NumerousGCActivity: AppCompatActivity() {
2
3 val NO_OF_VIEWS = 100000
4
5
6 override fun onCreate(savedInstanceState: Bundle?) {
7 super.onCreate(savedInstanceState)
8 setContentView(R.layout.activity_numerous_gc)
9 btn_start.setOnClickListener {
10 setupRecyclerView()
11 }
12 }
13
14 private fun setupRecyclerView() {
15 val numbers = arrayOfNulls(NO_OF_VIEWS).mapIndexed { index, _ -> index }
16 recyclerView.layoutManager = LinearLayoutManager(this)
17 recyclerView.adapter = NumerousGCRecyclerViewAdapter(numbers)
18 }
19}
20
21class NumerousGCRecyclerViewAdapter(private val numbers: List): RecyclerView.Adapter() {
22 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NumerousGCViewHolder {
23 val view = LayoutInflater.from(parent.context)
24 .inflate(R.layout.item_numerous_gc, parent, false)
25 return NumerousGCViewHolder(view)
26 }
27
28 override fun getItemCount(): Int {
29 return numbers.size
30 }
31
32 override fun onBindViewHolder(vh: NumerousGCViewHolder, position: Int) {
33 vh.textView.text = position.toString()
34
35 //Create bitmap from resource
36 val bitmap = if(position % 2 == 0)
37 BitmapFactory.decodeResource(vh.imageView.context.resources, R.drawable.big_bitmap)
38 else
39 BitmapFactory.decodeResource(vh.imageView.context.resources, R.drawable.small_bitmap)
40 vh.imageView.setImageBitmap(bitmap)
41 }
42}
43
44class NumerousGCViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
45 var textView: TextView = itemView.findViewById(R.id.text_view)
46 var imageView: ImageView = itemView.findViewById(R.id.image_view)
47}
مشاهده بدون نقص کدها
در این‌حالت کد نمونه برای پیاده‌سازی RecyclerView درست به کارگیری می‌گردد و با این حالا با ایرادات خاطر مواجه هستیم. حتی با این که RecyclerView راه حل خلل خاطر گذشته میباشد، ولی یک چاره همگی‌کاره برای کلیه اشتباهات یاد به اکانت نمی‌آید. برای یافتن ریشه نقص‌ می بایست داده ها بیشتری را آیتم نظارت در اختیار بگذاریم.

روی دکمه Record در پروفایلر یاد کلیک نمایید و برای مدتی به RecyclerView بروید بعد روی دکمه stop کلیک نمایید. براین اساس پروفایلر لیستی تفصیلی از مصرف یاد از سوی اشکال شیءهای گوناگون در دست شما قرار می دهد.


ریزه کاری تفصیلی مصرف یاد
فهرست را مبتنی بر اندازه سطحی تر و تمیز‌سازی فرمایید تا مشاهده کنید که مورد فوقانی یک آرایه بایت میباشد و از این رو میدانیم که نصیب بیشتر اختصاص یاد به تولید آرایه بایت تخصیص دارااست. فقط 32 اختصاص برای آرایه بایت وجود داراست و اندازه کلی بیت‌ها 577,871,888 میباشد که مساوی 72.23 مگابایت میباشد.

برای این که داده ها بیشتری به دست آوریم روی یکی نوبت‌های نما کلیک میکنیم تا اختصاص پشته فراخوانی را نیز ببینیم. سیاق هایلایت گردیده ()onBindViewHolder از NumerousGCRecyclerViewAdapter میباشد، البته ما هیچ آرایه بایتی را به طور مصرح با این روال نساخته‌ایم

در حالتی‌که به اسلوب آتی ()onBindViewHolder در پشته فراخوانی نگاه کنیم، می بینیم که‌این روال فراخوانی‌هایی در مسیر پایین ایفا می‌نماید:

decodeResource() -> decodeResourceStream() -> decodeStream() -> nativeDecodeAsset()
و در غایت به ()newNonMovableArray میرسد. مستندات این اسلوب اینگونه اعلام می‌نمایند که:

این اسلوب یک آرایه اختصاص‌یافته در یک سود از هیپ جاوا رجوع می دهد که هیچ زمان جابجا نخواهد شد. اسلوب آیتم اشاره برای پیاده‌سازی اختصاص‌های نیتیو روی هیپ جاوا مانند DirectByteBuffers و Bitmaps به کارگیری میگردد.

از این رو می توانیم فیض بگیریم که مصرف بالای خاطر آرایه‌های بایت ناشی از استعمال از اسلوب ()nativeDecodeAsset میباشد.

در واقع هر توشه که ما ()BitmapFactory.decodeResource را فراخوانی می کنیم، یک دفعه تازه از یک شیء بیت‌مپ ساخت و ساز می‌گردد و از این رو داده‌های آرایه بایت جدیدی اضافه میشوند. درصورتی که بتوانیم فراوانی احضار ()BitmapFactory.decodeResource را کاهش دهیم خواهیم توانست از نیاز به اختصاص یاد بیشتر دوری کنیم و از این رو از حادثه Garbage Collection بکاهیم.

1class LessNumerousGCRecyclerViewAdapter(private val context: Context,
2 private val numbers: List): RecyclerView.Adapter() {
3
4 val bitBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.big_bitmap)
5 val smallBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.small_bitmap)
6
7 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NumerousGCViewHolder {
8 val view = LayoutInflater.from(parent.context)
9 .inflate(R.layout.item_numerous_gc, parent, false)
10 return NumerousGCViewHolder(view)
11 }
12
13 override fun getItemCount(): Int {
14 return numbers.size
15 }
16
17 override fun onBindViewHolder(vh: NumerousGCViewHolder, position: Int) {
18 vh.textView.text = position.toString()
19
20 //Reuse bitmap
21 val bitmap = if(position % 2 == 0) bitBitmap else smallBitmap
22 vh.imageView.setImageBitmap(bitmap)
23 }
24}
مشاهده بی نقص کدها
کد فوق ورژن بهبودیافته‌ای از RecyclerViewAdapter میباشد که دفعه‌های بیت‌مپ را صرفا یک توشه ساخت می‌نماید، آنها‌را کش می‌نماید و از این بیت‌مپ‌ها برای imageView در روال ()onBindViewHolder به کار گیری دوباره می‌نماید. به این ترتیب از هر اختصاص خاطر غیرضروری دیگری اجتناب میشود. در‌پی به گراف یاد بعداز این بهبود نگاهی می‌اندازیم.


چنان که میبینید گراف خاطر صاف میباشد و صرفا یک اختصاص برای آرایه بایت وجود دارااست که اندازه آن ناچیز میباشد. در ضمنً نرم افزار در حال حاضر قادر است به صورت خل وچل اسکرول خواهد شد و هیچ نوع گیر کردن فیس نمی‌دهد. بنابراین ایراد یاد را حل کرده‌ایم.


RecyclerView جاری
عده بندی
امید خواهیم داشت با تفحص این راهنما ایده‌ای در خصوص نحوه به کارگیری از ابزار پروفایل کردن برای بررسی اشتباهات عملکردی نرم افزار‌های اندروید به دست آورده باشید. همواره به مصرف یاد در نرم افزار خویش دقت داشته باشید و از اختصاص منابع یاد غیرضروری اجتناب نمائید. کافی میباشد به خیال داشته باشید که مقصود ما این میباشد که گراف مصرف خاطر تا حد قابلیت و امکان مسطح باشد.

بازدید : 24
چهارشنبه 4 تير 1404 زمان : 16:56


انتساب مقدار تهی
Java
String otherName;
otherName = null;

Kotlin
var otherName: String?
otherName = null
تحقیق تهی بودن یک مقدار
1Java
2 if (text != null) {
3 int length = text.length();
4 }
5
6Kotlin
7 text?.let {
8 val length = text.length
9 }
10 // or simply
11 val length = text?.length

الحاق حرفه‌ها
1Java
2 String firstName = "Amit";
3 String lastName = "Shekhar";
4 String message طراحی اپلیکیشن در مشهد = "My name is: " + firstName + " " + lastName;
5Kotlin
6 var firstName = "Amit"
7 var lastName = "Shekhar"
8 var message = "My name is: $firstName $lastName"

ساخت‌و‌ساز خط نو در یک حرفه
1Java
2 String text = "First Line\\n" +
3 "Second Line\\n" +
4 "Third Line";
5Kotlin
6 val text = """
7 |First Line
8 |Second Line
9 |Third Line
10 """.trimMargin()

عملگر سه‌تایی
1Java
2
3 String text = x > 5 ? "x > 5" : "x <= 5";
4
5 String message = null;
6 log(message != null ? Message : "");
7
8Kotlin
9 val text = if (x > 5) "x > 5" else "x <= 5"
10
11 val message: String? = null
12 log(message ?: "")

عملگرهای بیتی
1Java
2 final int andResult = a & b;
3 final int orResult = a | b;
4 final int xorResult = a ^ b;
5 final int rightShift = a >> 2;
6 final int leftShift = a << 2;
7 final int unsignedRightShift = a >>> 2;
8
9Kotlin
10 val andResult = a and b
11 val orResult = a or b
12 val xorResult = a xor b
13 val rightShift = a shr 2
14 val leftShift = a shl 2
15 val unsignedRightShift = a ushr 2
مشاهده بدون نقص کدها
نظارت نوع و تبدیل نوع
1Java
2 if (object instanceof Car) {
3 }
4 Car car = (Car) object;
5
6Kotlin
7 if (object is Car) {
8 }
9 var car = object as Car
10 // if object is null
11 var car = object as? Car
12 // var car = object as Car?

حالت چندگانه (Switch Case)
1Java
2 int score = // some score;
3 String grade;
4 switch (score) {
5 case 10:
6 case 9:
7 grade = "Excellent";
8 break;
9 case 8:
10 case 7:
11 case 6:
12 grade = "Good";
13 break;
14 case 5:
15 case 4:
16 grade = "OK";
17 break;
18 case 3:
19 case 2:
20 case 1:
21 grade = "Fail";
22 break;
23 default:
24 grade = "Fail";
25 }
26Kotlin
27 var score = // some score
28 var grade = when (score) {
29 9, 10 -> "Excellent"
30 in 6..8 -> "Good"
31 4, 5 -> "OK"
32 in 1..3 -> "Fail"
33 else -> "Fail"
34 }
مشاهده بی نقص کدها
رینگ for
1Java
2
3 for (int i = 1; i <= 10 ; i++) { }
4
5 for (int i = 1; i < 10 ; i++) { }
6
7 for (int i = 10; i >= 0 ; i--) { }
8
9 for (int i = 1; i <= 10 ; i+=2) { }
10
11 for (int i = 10; i >= 0 ; i-=2) { }
12
13 for (String item : collection) { }
14
15 for (Map.Entry entry: map.entrySet()) { }
16
17Kotlin
18 for (i in 1..10) { }
19
20 for (i in 1 until 10) { }
21
22 for (i in 10 downTo 0) { }
23
24 for (i in 1..10 step 2) { }
25
26 for (i in 10 downTo 0 step 2) { }
27
28 for (item in collection) { }
29
30 for ((key, value) in map) { }
مشاهده بی نقص کدها
کلکسیون‌ها
1Java
2 final List listOfNumber = Arrays.asList(1, 2, 3, 4);
3 final Map keyValue = new HashMap();
4 map.put(1, "Amit");
5 map.put(2, "Ali");
6 map.put(3, "Mindorks");
7 // Java 9
8 final List listOfNumber = List.of(1, 2, 3, 4);
9 final Map keyValue = Map.of(1, "Amit",
10 2, "Ali",
11 3, "Mindorks");
12
13Kotlin
14 val listOfNumber = listOf(1, 2, 3, 4)
15 val keyValue = mapOf(1 to "Amit",
16 2 to "Ali",
17 3 to "Mindorks")
مشاهده بدون نقص کدها
تعریف و تمجید متدها
1Java
2 void doSomething() {
3 // logic here
4 }
5
6Kotlin
7 fun doSomething() {
8 // logic here
9 }

تعداد آرگومان‌های متغیر
1Java
2 void doSomething(int... numbers) {
3 // logic here
4 }
5
6Kotlin
7 fun doSomething(vararg numbers: Int) {
8 // logic here
9 }

تعریف‌و‌تمجید متدها با return
1Java
2 int getScore() {
3 // logic here
4 return score;
5 }
6Kotlin
7 fun getScore(): Int {
8 // logic here
9 return score
10 }
11 // as a single-expression function
12 fun getScore(): Int = score
13 // even simpler (type will be determined automatically)
14 fun getScore() = score // return-type is Int

قابلیت و امکان‌های جان دار در کاتلین کدام می‌باشند؟
در‌این قسمت برخی از قابلیت و امکان‌هایی که تنهاً در کاتلین وجود دارا‌هستند را معرفی میکنیم.

بازدید : 16
سه شنبه 3 تير 1404 زمان : 11:54


تعریف و تمجید یک ماژول Koin
مراد از ماژول در Koin یک کامپوننت میباشد که در آن تمامی تعلق‌هایی که در کامپوننت‌های دیگر تزریق میگردند را اعلان می کنیم. برای مثال سبک نما که در اکتیویتی استعمال می شود، در‌این ماژول اعلان شود. براین اساس یک ماژول اعلان میکنیم که برای ما نوبت‌ای از یک «سبک نما» (View Model) می‌سازد. به دنبال خوا‌هیم روئت کرد که عملیاتی که Koin برای ما اعمال می دهد، کاهش کد Boiler plate میباشد که در حین ساخت و ساز دفعه‌ای از سبک نما به طور پیش‌فرض ساخت‌و‌ساز طراحی اپلیکیشن در مشهد می‌کردیم.

برای ساخت‌و‌ساز ماژول بایستی از تابعی به اسم module به کارگیری کنیم که یک لامبدا تحت عنوان پارامتر میگیرد و می بایست ارجاعی به ماژول در متغیر داشته باشیم.

پوشه Module.kt

1val viewModelModule = module {
2 viewModel {
3 UserViewModel(get())
4 }
5}
6
7val repositoryModule = module {
8 single {
9 UserRepository(get())
10 }
11}
12
13val apiModule = module {
14 fun provideUseApi(retrofit: Retrofit): GithubApi {
15 return retrofit.create(GithubApi::class.java)
16 }
17
18 single { provideUseApi(get()) }
19}
20
21val retrofitModule = module {
22
23 fun provideGson(): Gson {
24 return GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create()
25 }
26
27 fun provideHttpClient(): OkHttpClient {
28 val okHttpClientBuilder = OkHttpClient.Builder()
29
30 return okHttpClientBuilder.build()
31 }
32
33 fun provideRetrofit(factory: Gson, client: OkHttpClient): Retrofit {
34 return Retrofit.Builder()
35 .baseUrl("https://api.github.com/")
36 .addConverterFactory(GsonConverterFactory.create(factory))
37 .client(client)
38 .build()
39 }
40
41 single { provideGson() }
42 single { provideHttpClient() }
43 single { provideRetrofit(get(), get()) }
44}
مشاهده بدون نقص کدها
در کد فوق از یک‌سری تابع Koin برای مدیر تعلق‌های متفاوت نرم افزار‌مان سود میگیریم.

ViewModel: یک کامپوننت ViewModel اعلان میکنیم و آن را به چرخه قدمت کامپوننت اندروید اتصال می دهیم.
()Get: در‌این مثل کلاس UserViewModel می بایست نوبت‌ای از UserRepository را تحت عنوان پارامتر بگیرد و از این رو از get()‎ در Koin استعمال می کنیم تا آن را به دست آوریم. این اسلوب فقط هنگامی عمل می‌نماید که یک ماژول وجود داشته باشد که‌این تعلق را ارائه نماید، در غیر این شکل Koin تعلق را پیدا نمی‌نماید.
Single: به Koin اعلام می‌نماید که یک سینگلتون ساخت‌و‌ساز نماید. این دفعه صرفا در حین اجرای نرم افزار تولید خواهد شد.
قدم 5: استارت به شغل Koin
فعلا که ماژول‌ها فراهم گردیده‌اند، قادر خواهیم بود آغاز به فعالیت با Koin بکنیم. آغاز کلاس نرم افزار را گشوده و یا این که آن را ساخت‌و‌ساز نمائید. دقت داشته باشید که بایستی آن را در manifest.xml اعلان فرمایید. کافی میباشد تابع startKoin()‎ را که یک لامبدا می گیرد فراخوانی فرمائید و در آن لیستی از ماژول‌ها را با استعمال از تابع modules(module: List)‎ تعریف و تمجید نمائید:


فولدر App.kt

1class App : Application() {
2 override fun onCreate() {
3 super.onCreate()
4 startKoin {
5 androidLogger(Level.DEBUG)
6 androidContext(this@App)
7 modules(listOf(repositoryModule, viewModelModule, retrofitModule, apiModule))
8 }
9 }
10}

قدم 6: تزریق تعلق‌ها
کامپوننت UserViewModel با به کارگیری از دفعه UserRepository ساخته میگردد. برای این که آن را وارد اکتیویتی بکنید، می بایست آن را با استعمال از تزریق کننده واسط by viewModel()‎ تزریق فرمایید:

پوشه MainActivity.kt

1class MainActivity : AppCompatActivity() {
2
3 private val userViewModel by viewModel()
4
5 override fun onCreate(savedInstanceState: Bundle?) {
6 super.onCreate(savedInstanceState)
7 setContentView(R.layout.activity_main)
8
9 userViewModel.data.observe(this, Observer {
10 // Populate the UI
11 })
12
13 userViewModel.loadingState.observe(this, Observer {
14 // Observe the loading state
15 })
16 }
17}
مشاهده بدون نقص کدها
حرف نهایی
Koin در همگی جا از نرم افزار‌های تلفن همراه تا اینترنت موجب سهولت تزریق تعلق میگردد و نباید درباره‌ی به کارگیری از آن نگرانی داشته باشید. Koin یک فریمورک قادر میباشد که به ارتقاء سود‌وری عمل با کاتلین امداد می‌نماید.

بازدید : 16
دوشنبه 2 تير 1404 زمان : 10:31


راهنمای تولید 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 سفارشی برای خودتان به دست آورده باشید.

بازدید : 21
شنبه 31 خرداد 1404 زمان : 10:52


ایمپورت کلاس‌های مایحتاج
پیش از هر چیز بایستی خط ایمپورت‌ها کد پایین را اضافه کنیم:

1import androidx.appcompat.app.AlertDialogimport android.view.View

قسمت ایمپورت‌ها را می‌اقتدار مخفی کرد. برای مفتوح کردن هم یا این که روی بیضی‌ها دابل-کلیک نمایید یا این که روی آیکون + سمت راست خط بزنید. در زمینه ی ترتیب این طراحی اپلیکیشن در مشهد مورد ها نگران نباشید زیرا تفاوتی ساخت و ساز نمی‌نماید.

ساخت و ساز یک سیاق برای اکران اخطار
در حال حاضر وهله به خویش اخطار رسیده میباشد که ذیل روال ()onCreate می‌نویسیم. یک مشی نو برای اکران اخطار با کد پایین تولید نمائید:

1fun showBasicDialog(view: View?) {

2 //1
3 val builder = AlertDialog.Builder(this)
4 //2
5 builder.setTitle("Alert")
6 builder.setMessage("The body of my alert")
7 //3
8 builder.show()
9}

کد فوق را قدم به قدم تحقیق میکنیم. نصیب‌های گوناگون با کامنت شماره‌گذاری گردیده‌اند که ولی شما نیازی به ایفا این شغل ندارید.

اندروید یک builder پیش‌فرض برای تولید Alert Dialogs ارائه می‌نماید، به این ترتیب ما یحتاج وجود ندارد درخصوص منطق آن نگران باشید. با استعمال از آن به نرم افزار اعلام میکنیم که یک Builder برای «این» ‌کلاس بسازد.
برای اخطار خویش یک تیتر و پیام انتخاب می کنیم.
از بیلدر میخواهیم که اخطار را اکران دهد.
اینک بایستی این اسلوب را به ترتیبی فراخوانی کنیم. در پایان ()onCreate، کد تحت را اضافه نمایید:

1showBasicDialog(null)

در صورتی‌که مطمئن نیستید که کد شما اکنون می بایست به چه شکل باشد، به تصویر تحت نگاه نمائید. در صورتی‌که داده ها نو متعددی می بینید، نگران نباشید زیرا تمامی این مفاد را معدود‌نادر رسیدگی خوا هیم کرد:

در حال حاضر نرم افزار را اعمال نمائید تا ملاحظه کنید چه اتفاقی فیس می دهد:

چنان که می بینید به محض اجرای نرم افزار، اخطار روی برگه اکران یافت. استدلال این قضیه خط کدی میباشد که در قدم انتها به روال ()onCreate اضافه کردیم تا بی‌فکر اخطار را علامت دهد. با این که‌این موقعیت مناسب ما وجود ندارد، البته دست‌کم فعلا از روش فعالیت آن استحضار داریم.

الصاق سیاق ()onCreate به اکشن دکمه
قدم بعدی این میباشد که کاری کنیم عوض این که اسلوب ()onCreate اخطار را نماد دهد، کاری کنیم که دکمه این فعالیت را جاری ساختن نماید. بدین خواسته به پوشه activity_main.xml بازگردید و خط ذیل را باطن تگ دکمه اضافه فرمائید:

1android:onClick="showBasicDialog"

فیض این بازنویسی پوشه XML در تصویر ذیل چشم می گردد:

دقت فرمائید که پارامتری به مشخصه onClick اضافه گردیده ست که به عبارتی مقدار اسم تابعی که پیش از اینً ساخت‌و‌ساز کردیم یعنی funshowBasicDialog(view: View?) را داراست. در اینجا نکته کلیدی پارامتر view میباشد. اسلوب آیتم استعمال برای یک اتفاق افتاد onClick بایستی یک پارامتر view داشته باشد تا عمل نماید.

در حال حاضر فراخوانی showBasicDialog(null) را از onCreate حذف کرده و نرم افزار را انجام نمائید:


به این ترتیب قسمت در آغاز ایجاد کرد دیالوگ اخطار نقطه پایان یافته میباشد.

قسمت 2: اضافه کردن تعامل
فعلا لحظه‌ای فکر می کنیم و روی اول چیزی که در طی پندار کردن به دیالوگ یا این که اخطار به ذهن می رسد، متمرکز می‌شویم. این تأمل را با فیض واپسین قدم ما یعنی تصویر فوق مقایسه نمایید. اول کمبودی که چشم می شود، خلا دکمه در دیالوگ اخطار میباشد. اکثر زمان ها اخطارها تعاملی میباشند یعنی آیتم‌هایی دارا هستند که قادر خواهیم بود از در میان آنها یکی‌از را تعیین کنیم. اما احتمالاً سازه به تجارب می دانید که در حین اکران دیالوگ‌ها با کلیک روی منطقه خاکستری پیرامونی بسته می‌گردد، ولی این شرایط از لحاظ تجربیات کاربری مطلوب وجود ندارد.

دکمه‌ها و تجربیات کاربری (UX)
دکمه‌ها یکی جالب‌ترین اجزای دنیای دیجیتال محسوب می گردند، ولی میدانیم که دکمه‌ها کالا این جهان نیستند و پیش از پدید داخل شدن رایانه‌ها و تلفن همراه‌ها هم وجود داشتند. در واقع این جادوی دکمه‌ها میباشد، زیرا به دنیای فیزیکی وابستگی دارا‌هستند و از این جهت میباشد که تمامی اشخاص به صورت شهودی می دانند چطور از آن به کارگیری نمایند. از سوی دیگر کلیک کردن روی منطقه خاکستری بیرون دیالوگ چیزی میباشد که بایستی به یار و همدم فناوری و الگوهای پیاده سازی امروزی آموخته خواهد شد؛ البته لزوماً شهودی وجود ندارد.

دکمه‌ها اجزای رایج پیاده سازی تعاملی می‌باشند. با این که ممکن میباشد اجزای بسیار معمولی‌ای از UI به حیث برسند، ولی ساختن آنان مداقه بسیار متعددی داراست.

اضافه کردن دکمه به اخطار


بایستی اشاره نمود که دکمه‌ها به ما حق تعیین میدهند. در اکثر وقت ها دیالوگ‌های اخطار بایستی دربین دو آیتم، یک کدام از را گزینش کنیم که به صورت معمول مورد‌های yes و no می‌باشند. اعتنا داشته باشید که‌این مورد‌ها بسته به غرض شما می توانند گوناگون باشند.

وقتی که پروژه را گشوده کردید به فولدر MainActivity.kt بروید و ()showBasicDialogFragment را بعداز فرمان builder.setMessage(“your message”) و پیش از ()builder.show پیدا نمائید. در‌این قسمت، آیتم‌های اخطار را اضافه میکنیم:

1//1
2builder.setPositiveButton("Yes") { dialog, which ->
3 //2
4 Toast.makeText(applicationContext, "Yes", Toast.LENGTH_SHORT).show()
5}
6//3
7builder.setNegativeButton("No") { dialog, which ->
8 //4
9 Toast.makeText(applicationContext, "No", Toast.LENGTH_SHORT).show()
10}

احتمالاً واژه و کلمه toast به رنگ قرمز‌رنگ درمی‌آید. عامل این زمینه عدم وجود آیتم ایمپورت میباشد. براین اساس ایمپورت آن را در اولِ فولدر اضافه میکنیم. همینطور میتوانید از کلیدهای ترکیبی option+intro یا این که ctrl+intro برای ایمپورت اتوماتیک آن به کار گیری فرمایید:

1//5
2import android.widget.Toast

کد فوق را قدم به گم رسیدگی می کنیم.

آغاز به شیء builder می گوییم که یک دکمه positive ساخت نماید. اندروید به صورت پیش‌فرض می داند که دکمه positive چیست و گه گاه به سیستم با مفاد دسترس‌پذیری متعلق میباشد و با به کارگیری از امر‌ها صوتی یا این که شیوه‌های دیگر میتوانید آن‌ها‌را تحریک نمائید. تأکید میکنیم که متن آن بایستی Yes باشد. بعد دو پارامتر اضافه میکنیم که او‌لین نشانه میدهد یک دیالوگ میباشد و دو‌مین یک پارامتر which میباشد که روی داد بعداز کلیک را مشخص و معلوم می‌سازد.
در قسمت 2 یک اکشن وجود دارااست که در حین کلیک کردن دکمه Yes جاری ساختن می گردد. در این باره یک مورد Toast ساخت می گردد که آن نیز متن Yes داراست تا کارکرد دکمه آزمایش گردد.
در قسمت 2 به عبارتی کد وجود داراست، البته این توشه دکمه منفی با متن No تعریف و تمجید می گردد.
همچون نصیب پیشین این توشه نیز یک Toast با متن NO به کار گیری می‌گردد.

بازدید : 26
سه شنبه 27 خرداد 1404 زمان : 17:53


TikTok
۹

تیم بندی : اشتراک کلیپ

این گروه بندی برای اشتراک گذاری البته اینبار اشتراک گذاری کلیپ به طور طراحی اپلیکیشن در مشهد مخصوص میباشد.
تیک تاک یک کدام از مشهور ترین و دوستداشتنی ترین نرم افزار های دنیا میباشد.

TikTok یک کدام از دوست داستنی ترین نرم‌افزار های سرگرمی ویدیویی کوتاه میباشد.
در سال ۲۰۲۰ واحد سنجش یوزرها و محبوبیت این اپلیکیشن ۵ موازی پروش یافت که عمدتاً به جهت قرنطینه های کووید 19 بود.
تا سال ۲۰۲۱ ، TikTok با ۶۲ میلیون نصب در ژانویه ۲۰۲۱ ، دو‌مین نرم افزار غیربازی نصب گردیده‌است.
TikTok تحت عنوان یک نرم‌افزار همگام سازی استارت به فعالیت کرد که به یک پدیده رسانه اجتماعی تبدیل شد.
TikTok ایجاد کرد کلیپ را معمولی کرد و پلتفرمی ساخت که در آن یوزرها به راحتی می‌توانند محتوای بقیه یوزرها را به اشتراک بگذارند و مشاهده نمایند.
و با تولید فرمت کوتاه محتوا ، اندازه لقمه محتوای TikTok را می سازد.

فیچرها :
یکی‌از خصوصیت های کلیدی TikTok تمرکز آن بر محتوای محلی میباشد.
این نرم افزار مسابقات و بحران‌هایی را مبنی بر روندهای محلی ایفا می‌نماید که هزاران ویدئو و محتوای ویروسی را برای اپ ساخت‌و‌ساز می‌نماید.
یکی‌از دیگر از خصوصیت های بلندتر ، سفارش های فردی آن میباشد که برای یوزرها خویش مطابق ترجیحات آن ها ساخت و ساز می نماید.
با ارائه محتوایی که بر پایه ی با ترجیحات آن ها باشد ، واپسین ویدیوهای پرطرفدار را در چنگ یوزرها قرار می‌دهد تا یوزرها ایده های بیشتری برای ساخت محتوا داشته باشند.

تعداد دانلود :

۱+ میلیارد

امتیاز :

4.4/5
دانلود از گوگل پلی
دانلود از برنامه استور

Canva
۱۰

تیم بندی : پیاده سازی

رسیدیم به یک تیم بندی مختص هنرمندان و طراحان که در آن Canva درجه ی اولیه را داراست و Draw Pad Pro که در مرتبه ی آینده آن را معرفی میکنیم ، درجه ی دوم را دارا است.
چه نیاز به پیاده سازی یک عکس هدر تازه در چهره بوک داشته باشید یا این که یک جلد برای نشر کتاب الکترونیکی Kindle خویش ساخت‌و‌ساز فرمایید، Canva اپلیکیشن پیاده سازی گرافیکی مجانی و بصری میباشد که می‌تواند به شما در اعمال آن در یکسری دقیقه یاری دهد.
پیش از سفارشی کردن پیاده سازی خویش با به کارگیری از امکان کشیدن و آزاد کردن راحت اپلیکیشن ، تصاویر خویش را آپلود فرمایید یا این که از در میان عکس ها و تصاویر دست دوم ممتاز تعیین نمایید.
Canva اشکال طرح‌بندی ، عکس‌های بدون‌پول ، فونت‌ها ، صورت‌ها ، نمادها ، نمودارها ، خطوط ، تصاویر ، کانال‌ها و آیتم‌های پس‌مورد را ارائه می دهد که می توانید از آنان برای پیاده سازی گرافیک خویش دقیقاً همانگونه که میخواهید استعمال نمائید.
هنگامی کارتان به پایان رسید ، آن را تحت عنوان یک تصویر با با کیفیت در رول دوربین یا این که فولدر عکس خویش ذخیره فرمایید یا این که آن را مستقیماً با به کار گیری از اپ اجتماعی گزینه عشق خویش به اشتراک بگذارید.

فیچرها :
پیاده سازی سهل و آسان و سریع
هزاران پوسته مهیا برای پست و استوری
ده ها ابزار دستکاری ماهر برای تصویر ، کلیپ و متن
رابط کاربری سهل و آسان به صورت کشیدن و رهاکردن
قابل به کارگیری برای اکثر شبکه های مردمی
تعداد دانلود :

۱۵۰+ میلیون

امتیاز :

4.8/5
دانلود از گوگل پلی
دانلود از اپلیکیشن استور

Draw Pad Pro
۱۱

تیم بندی : پیاده سازی

Draw Pad Pro یک طریق موثر برای مدیر آحاد طرح ها ، یادداشت ها و موردها دیگر برای یوزرها اندروید و ios میباشد.
این نرم افزار از فناوری تازه iOS 6 نیز به کار گیری می نماید تا تجارب بهتری نسبت به اکثری از اپلیکیشن های دیگر برای پیاده سازی یا این که یادداشت برداری ارائه دهد.

فیچرها :
سازندگان این برنامه آن را با حدس سازش و اصل عکس العمل گرایی پیاده سازی کرده اند.
می‌توانید هر چیزی را از رنگ و صفحه های نوت بوک گرفته تا ظواهر و بگراند اپلیکیشن تغییر‌و تحول دهید.
بیش تر از ۲۰ رنگ ورقه و دفترچه یادداشت و پنج تم وجود دارااست تا ظواهر و حس دلخواه شمارا به دست آورید.
حتی می‌توانید استایل های شیت را برای صفحه ها متعدد دفترچه یادداشت خویش مخلوط و منطبق دهید.
خودکارها ، بیست گزینش رنگی و شش سایز متفاوت دارا هستند.
برای کسب به جزئیات بیشتر با طرح های خویش می‌توانید با فشردن انگشتان خویش زوم نمایید.
بسته به آنچه نیاز دارید ، عکس‌ها را بچرخانید ، اندازه را تغییر‌و تحول دهید و روی بوم اضافه نمائید.
همینطور میتوانید تصاویر را با استعمال از ابزار ردیابی نرم‌افزار نسخه برداری و ردیابی نمائید.
نمای بیرونی ملایم Draw Pad Pro داده ها مقداری از فایده وری قدرتمندی دارااست که می‌تواند داشته باشد.
این یک اپ ضروری برای طراحان در سال ۲۰۲۲ میباشد.

تعداد دانلود :

۱۰۰+ هزار

امتیاز :

3.5/5
دانلود از گوگل پلی
دانلود از نرم‌افزار استور

Instagram
۱۲

مجموعه بندی : کانال ی اجتماعی

اینستاگرام اپلیکیشنی میباشد که حقیقتا نیازی به معرفی برای یوزرها سرتاسر عالم نداشته و از کم نرم‌افزار هایی است که برای همگی ی دنیا شناخته شد‌ه‌است.
ولی ما بر حسب پوسته نوشته‌علمی ی خویش ، یک معرفی کوتاهی از این کانال ی اجتماعی پربیننده نیز خوا هیم داشت.
اینستاگرام بی شک تبارک ترین کانال ی اجتماعی اکنون حاضر دنیا میباشد که به شما اذن ی اشتراک گذاری تصاویر و ویدیوهایتان را به طور پست و استوری می‌دهد.
همینطور قابلیت و امکان های دستکاری ، تگ گذاری ، ارائه ی توضیحات و کاربری های تجاری نیز به یوزرها را میدهد که از مداقه این کانال ی اجتماعی میباشد.
الگوریتم اینستاگرام برای قیمت پیج ها و اکانت های کاربری باطن آن بر پایه ی تعداد فالوور ، چگونگی پست ها و استوری ها ، ترازو لایک و کامنت های آنان ، ترازو بازدید و مواقعی از این قبیل میباشد.

فیچرها :
اشتراک گذاری تصاویر و ویدیوها در پوسته پست ، استوری و فیلم بلند
اکانت کاربری تجاری و کسب درآمد از این کانال
ریلز و قابلیت و امکان درج ویدیوهای کوتاه و بلند به یار و همدم بازنویسی آنان
لایک ، کامنت گذاری و اشتراک گذاری ویدیوها
لایو
تعقیب کردن و دنبال شدن

بازدید : 14
دوشنبه 26 خرداد 1404 زمان : 14:01


نکته‌های اساسی در زمینه ی وراثت در کاتلین
چنانچه کلاس یک تولید کننده نخستین داشته باشد، پایه بایستی با به کارگیری از پارامترهای آفریننده اول مقداردهی گردد. در اپ فوق، هر دو کلاس مشتق‌گردیده دارنده پارامترهای age و name می باشند و هر دوی این پارامترها در تولید کننده اول کلاس اساس مقداردهی می شوند. به نمونه طراحی اپلیکیشن در مشهد تحت دقت نمایید:

1open class Person(age: Int, name: String) {
2 // some code
3}
4
5class Footballer(age: Int, name: String, club: String): Person(age, name) {
6 init {
7 println("Football player $name of age $age and plays for $club.")
8 }
9
10 fun playFootball() {
11 println("I am playing football.")
12 }
13}
14
15fun main(args: Array) {
16 val f1 = Footballer(29, "Cristiano", "LA Galaxy")
17}
مشاهده بی نقص کدها
در کد فوق، آفریننده اول کلاس مشتق‌گردیده 3 پارامتر دارااست و کلاس اساس دارنده 2 پارامتر میباشد. دقت فرمائید که هر دوی این پارامترهای کلاس شالوده، مقداردهی گردیده‌اند. در زمینه‌ی خلا آفریننده نخستین، هر کلاس شالوده بایستی شالوده را مقداردهی نمایند یا این که خالق دیگری را که‌این شغل را می‌نماید نمایندگی نماید. به نمونه پایین اعتنا نمایید:

1fun main(args: Array) {
2
3 val p1 = AuthLog("Bad Password")
4}
5
6open class Log {
7 var data: String = ""
8 var numberOfData = 0
9 constructor(_data: String) {
10
11 }
12 constructor(_data: String, _numberOfData: Int) {
13 data = _data
14 numberOfData = _numberOfData
15 println("$data: $numberOfData times")
16 }
17}
18
19class AuthLog: Log {
20 constructor(_data: String): this("From AuthLog -> + $_data", 10) {
21 }
22
23 constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) {
24 }
25}
مشاهده بی نقص کدها
Override کردن تابع‌های عضو و مشخصه‌ها
در حالتی‌که کلاس شالوده و کلاس مشتق‌گردیده مشتمل بر یک تابع (یا این که مشخصه) عضو با اسم یکسان باشند، میتوانید تابع عضو کلاس مشتق‌گردیده را با استعمال از کلیدواژه open برای تابع عضو کلاس اساس override نمایید.

مثالی از Override کردن تابع عضو
1// Empty primary constructor
2open class Person() {
3 open fun displayAge(age: Int) {
4 println("My age is $age.")
5 }
6}
7
8class Girl: Person() {
9
10 override fun displayAge(age: Int) {
11 println("My fake age is ${age - 5}.")
12 }
13}
14
15fun main(args: Array) {
16 val girl = Girl()
17 girl.displayAge(31)
18}
مشاهده بدون نقص کدها
خروجی نرم افزار فوق به طور پایین میباشد:

My fake age is 26.
در نرم‌افزار فوق، girl.displayAge(31) روال ()displayAge مرتبط با کلاس مشتق‌گردیده به اسم girl.displayAge(31) مبادرت به فراخوانی ()displayAge می‌نماید. قابلیت و امکان اُوراید کردن کلاس محور به نحوه شبیه نیز وجود داراست.

1// Empty primary constructor
2open class Person() {
3 open var age: Int = 0
4 get() = field
5
6 set(value) {
7 field = value
8 }
9}
10
11class Girl: Person() {
12
13 override var age: Int = 0
14 get() = field
15
16 set(value) {
17 field = value - 5
18 }
19}
20
21fun main(args: Array) {
22
23 val girl = Girl()
24 girl.age = 31
25 println("My fake age is ${girl.age}.")
26}
مشاهده بدون نقص کدها
خروجی نرم‌افزار فوق به طور ذیل میباشد:

My fake age is 26.
چنان که میبینید از کلیدواژه‌های override و open برای مشخصه age به ترتیب در کلاس مشتق‌گردیده و کلاس اساس به کار گیری کرده‌ایم.

فراخوانی عضو‌های کلاس محور از کلاس مشتق‌گردیده
قابلیت و امکان فراخوانی تابع‌ها (و مشخصه‌های دسترسی) کلاس اساس از یک کلاسی مشتق‌گردیده با به کارگیری از کلیدواژه super وجود دارااست. به نمونه پایین دقت نمایید:

1open class Person() {
2 open fun displayAge(age: Int) {
3 println("My actual age is $age.")
4 }
5}
6
7class Girl: Person() {
8
9 override fun displayAge(age: Int) {
10
11 // calling function of base class
12 super.displayAge(age)
13
14 println("My fake age is ${age - 5}.")
15 }
16}
17
18fun main(args: Array) {
19 val girl = Girl()
20 girl.displayAge(31)
21}
مشاهده بی نقص کدها
خروجی نرم افزار فوق به طور پایین میباشد:

My age is 31.
My fake age is 26.

بازدید : 29
يکشنبه 25 خرداد 1404 زمان : 16:55


فراخوانی تابع به طرز میانوندی
درین قسمت از نوشته ی علمی یادگرفتن کاتلین به پژوهش طریق به کار گیری از نمادگذاری میانوندی برای فراخوانی تابع‌ها خوا هیم پرداخت و نمونه‌هایی را درین خصوص آیتم رسیدگی قرار می دهیم. قبل از آن که در خصوص نحوه ساخت یک تابع با نمادگذاری میانوندی توضیح دهیم، به پژوهش دو تابع رایج با این نحوه آرم‌گذاری طراحی اپلیکیشن در مشهد می پردازیم.

وقتی که از عملگرهای || و && به کار گیری می کنیم، کامپایلر به ترتیب پیرو تابع‌های or و and می شود و آنها‌را در پس‌قضیه فراخوانی می‌نماید. این دو تابع از نمادگذاری میانوندی دفاع می‌نمایند.

مثالی از تابع or و and در کاتلین
1fun main(args: Array) {
2 val a = true
3 val b = false
4 var result: Boolean
5
6 result = a or b // a.or(b)
7 println("result = $result")
8
9 result = a and b // a.and(b)
10 println("result = $result")
11}

خروجی نرم افزار فوق به طور پایین میباشد:

result = true

result = false
در نرم‌افزار فوق، از عبارت a or b به مکان a.or(b) و از عبارت a and b به مکان a.and(b) مصرف شده میباشد. برهان این که قابلیت اینگونه کاری وجود داراست، این میباشد که‌این دو تابع از نمادگذاری میانوندی دفاع می‌نمایند.

نحوه ساخت‌و‌ساز تابعی با نمادگذاری میانوندی در کاتلین چه‌گونه میباشد؟
در شرایطی که که تابعی کلیه حالت ذیل را داشته باشد، خواهیم توانست آن را با به کار گیری از نمادگذاری میانوندی فراخوانی کنیم:

ابن تابع یک تابع عضو (یا این که تابع توسعه) باشد.
این تابع صرفا یک پارامتر داشته باشد.
این تابع با کلیدواژه infix نماد‌گذاری گردیده باشد.
مثالی از تابع تعریف‌و‌تمجید ‌گردیده‌ استفاده کننده با نمادگذاری میانوندی
1class Structure() {
2
3 infix fun createPyramid(rows: Int) {
4 var k = 0
5 for (i in 1..rows) {
6 k = 0
7 for (space in 1..rows-i) {
8 print(" ")
9 }
10 while (k != 2*i-1) {
11 print("* ")
12 ++k
13 }
14 println()
15 }
16 }
17}
18
19fun main(args: Array) {
20 val p = Structure()
21 p createPyramid 4 // p.createPyramid(4)
22}
مشاهده بدون نقص کدها
خروجی نرم‌افزار فوق به طور تحت میباشد:

*
* * *
* * * * *
* * * * * * *
در اپلیکیشن فوق، ()createPyramid یک تابع میانوندی میباشد که یک ساختار هرمی ساخت و ساز می‌نماید. این تابع یک تابع عضو کلاس Structure میباشد که فقط یک پارامتر از نوع Int می گیرد و با کلیدواژه infix استارت می‌گردد.

تعداد ستون‌های هرم به آرگومان‌های ارسالی به تابع بستگی داراست.

آرگومان‌های پیش‌فرض و اسم‌دار در کاتلین
در‌این قسمت از نوشته‌علمی فراگیری کاتلین به تحقیق آرگومان‌های پیش‌فرض و اسم‌دار درین لهجه اپ‌نویسی می پردازیم و نمونه‌هایی را درین خصوص پژوهش خوا‌هیم کرد.

آرگومان پیش‌فرض در کاتلین
در لهجه کاتلین، می‌قدرت در تمجید تابع، مقادیر پیش‌خیالی برای پارامترها ارائه کرد. چنانچه تابع با آرگومان‌های ارسالی فراخوانی خواهد شد، این آرگومان‌ها تحت عنوان پارامتر استعمال میگردند. با این هم اکنون، در صورتیکه تابع فارغ از ارسال پارامتر (ها) فراخوانی گردد، آرگومان‌های پیش‌فرض گزینه به کارگیری قرار می گیرند.

طریق عمل آرگومان پیش‌فرض در کاتلین چه طور میباشد؟
در‌این قسمت با شیوه فعالیت آرگومان‌های پیش‌فرض در شرایط‌های متعدد آشنا می‌شویم.

وضعیت اولیه: همگی آرگومان‌ها ارسال شوند


تابع ()foo دو آرگومان میگیرد. این آرگومان‌ها دارنده مقادیر پیش‌فرض می باشند. با این اکنون در نرم‌افزار فوق، تابع ()foo با ارسال هر دو آرگومان فراخوانی گردیده‌است. از این رو آرگومان‌های پیش‌فرض گزینه به کارگیری قرار نگرفته‌اند. داخل تابع ()foo مقادیر letter و number به ترتیب موازی با \'x\' و 2 میباشند.

تعداد صفحات : 1

درباره ما
موضوعات
آمار سایت
  • کل مطالب : 795
  • کل نظرات : 0
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • بازدید امروز : 133
  • بازدید کننده امروز : 1
  • باردید دیروز : 413
  • بازدید کننده دیروز : 0
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 1389
  • بازدید ماه : 1668
  • بازدید سال : 6347
  • بازدید کلی : 39913
  • <
    پیوندهای روزانه
    اطلاعات کاربری
    نام کاربری :
    رمز عبور :
  • فراموشی رمز عبور؟
  • خبر نامه


    معرفی وبلاگ به یک دوست


    ایمیل شما :

    ایمیل دوست شما :



    کدهای اختصاصی