<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vishnu Haridas</title>
    <description>The latest articles on DEV Community by Vishnu Haridas (@vishnuharidas).</description>
    <link>https://dev.to/vishnuharidas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F58407%2F5802e9d5-8723-4b9f-b9e1-235971a8f811.jpg</url>
      <title>DEV Community: Vishnu Haridas</title>
      <link>https://dev.to/vishnuharidas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vishnuharidas"/>
    <language>en</language>
    <item>
      <title>Native or Cross Platform: What's Best for Your Next App? (external)</title>
      <dc:creator>Vishnu Haridas</dc:creator>
      <pubDate>Wed, 08 Feb 2023 16:17:03 +0000</pubDate>
      <link>https://dev.to/vishnuharidas/native-or-cross-platform-whats-best-for-your-next-app-external-3g8g</link>
      <guid>https://dev.to/vishnuharidas/native-or-cross-platform-whats-best-for-your-next-app-external-3g8g</guid>
      <description>&lt;p&gt;&lt;strong&gt;See the original blog post in &lt;a href="https://blog.qburst.com/2023/01/native-or-cross-platform-whats-best-for-your-next-app/" rel="noopener noreferrer"&gt;QBurst blog.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether to opt for native development or cross-platform is a question as old as the major mobile platforms themselves. Yet it continues to vex clients on the verge of their next app project even in 2023.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Shall we use cross platform or native development?”&lt;/li&gt;
&lt;li&gt;“I heard that React Native costs less, so can we use it?”&lt;/li&gt;
&lt;li&gt;“Why Airbnb moved to native development lately?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hear a lot of such questions from clients all the time. They are always confused which technology to choose to build their next app. They hear a lot that cross platform is cheaper, but confused why still many people are opting for native development.&lt;/p&gt;

&lt;p&gt;I am exploring the options from the experience that I had in the last decade working on both native and cross platform tools to build mobile apps. This will help you to make a decision whether to choose cross platform or native development to build your next mobile app. &lt;a href="https://blog.qburst.com/2023/01/native-or-cross-platform-whats-best-for-your-next-app/" rel="noopener noreferrer"&gt;Read the blog post here.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>What is the "Bus Factor" of Your Project?</title>
      <dc:creator>Vishnu Haridas</dc:creator>
      <pubDate>Sat, 04 Sep 2021 18:44:23 +0000</pubDate>
      <link>https://dev.to/vishnuharidas/what-is-the-bus-factor-of-your-project-403f</link>
      <guid>https://dev.to/vishnuharidas/what-is-the-bus-factor-of-your-project-403f</guid>
      <description>&lt;p&gt;&lt;em&gt;(Also posted in my &lt;a href="https://iamvishnu.com/posts/what-is-the-bus-factor-of-your-project"&gt;personal blog&lt;/a&gt;. Cover photo by &lt;a href="https://unsplash.com/@hydngallery?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Haidan&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/bus?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I came across the term “bus factor” a couple of years ago, and since then I always keep an eye on the bus factor of the projects or other mission-critical things in my life. I always try to keep the bus factor more than one whenever possible.&lt;/p&gt;

&lt;p&gt;Wait, wait, what’s a “bus factor”? &lt;/p&gt;

&lt;p&gt;From &lt;a href="https://en.wikipedia.org/wiki/Bus_factor"&gt;Wikipedia&lt;/a&gt;, &lt;em&gt;the &lt;strong&gt;bus factor&lt;/strong&gt; is a measurement of the risk resulting from information and capabilities not being shared among team members, derived from the phrase "in case they get hit by a bus."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The term “hit by bus” could be any event that causes a person to disappear unexpectedly — from a medical emergency to an internet blackout.&lt;/p&gt;

&lt;p&gt;For example, imagine Alice is a very critical member of a project. Alice is the only person who knows the really important information of the project like account passwords, customer contact details, etc., that no other project members are aware of. The bus factor of this project is 1. If Alice suddenly disappears one day, the project will get stopped because of the lack of critical information required to run the project.&lt;/p&gt;

&lt;p&gt;Meanwhile if Bob also knew the said information, the bus factor would have been 2. In this case, even if Alice disappears suddenly, the project can continue with Bob (of course, now bringing the bus factor back to 1 because Alice is now gone).&lt;/p&gt;

&lt;p&gt;So, never make the bus factor 1. The higher the bus factor, the lower the risk.&lt;/p&gt;

&lt;p&gt;Here is a couple of examples from my life.&lt;/p&gt;

&lt;h3&gt;
  
  
  When working on software projects
&lt;/h3&gt;

&lt;p&gt;I always ask the developers to keep a shared sheet with all the credentials and other important information consolidated in it. This will include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account details and passwords of tools, services, or websites used.&lt;/li&gt;
&lt;li&gt;Special instructions to build and deploy the project.&lt;/li&gt;
&lt;li&gt;Checklists and any other important information related to that project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if the person who regularly builds and deploys the project disappears suddenly (either due to an emergency, or an internet blackout during the delivery time slot) someone else can refer the documents and continue working on the delivery of the project.&lt;/p&gt;

&lt;h3&gt;
  
  
  A very recent experience
&lt;/h3&gt;

&lt;p&gt;Very recently, there was a medical emergency in my family and I had to raise a good amount of money in a very short period. I contacted my friend, and he told me that he will arrange and send the money the next day. &lt;/p&gt;

&lt;p&gt;I quickly realized that the bus factor is just one, and can’t really depend on a single person for the money in such a critical situation. I contacted several other friends, and four more friends agreed to send the money if required. Now the bus factor is improved to 5.&lt;/p&gt;

&lt;p&gt;Unexpectedly on the next day, the first friend got into an emergency situation where his car stopped working in the middle of the traffic, had to tow it to the service station, and his whole day got ruined. He was totally unable to arrange the money on time.&lt;/p&gt;

&lt;p&gt;Luckily my bus factor was 5, so I had 4 more persons remaining. Finally the money was arranged and everything went smoothly.&lt;/p&gt;

&lt;p&gt;Had I kept my bus factor to just 1 in this case, I would have been doomed that day!&lt;/p&gt;

&lt;h3&gt;
  
  
  Another experience from a friend
&lt;/h3&gt;

&lt;p&gt;One of my friends kept all her children’s tons of childhood photos in an external hard disk. One day the hard disk fell down and gigabytes of memory got destroyed instantly! The bus factor was just 1 here — if the hard disk is gone, everything is gone. If she kept another backup in a DVD, another hard disk, or uploaded to Google Photos, she could improve the bus factor many times and reduce the risk of losing all her precious memories.&lt;/p&gt;




&lt;p&gt;So, let me ask once again. What’s your bus factor?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The `finally` Block in `try-catch-finally` Executes Always</title>
      <dc:creator>Vishnu Haridas</dc:creator>
      <pubDate>Wed, 23 Sep 2020 17:41:51 +0000</pubDate>
      <link>https://dev.to/vishnuharidas/the-finally-block-in-try-catch-finally-executes-always-5cnf</link>
      <guid>https://dev.to/vishnuharidas/the-finally-block-in-try-catch-finally-executes-always-5cnf</guid>
      <description>&lt;p&gt;&lt;em&gt;This article shows Javascript examples. I tried this in Javascript, Java, and Kotlin. A more Kotlin-centric approach in my personal &lt;a href="https://iamvishnu.com/posts/finally-block-executes-always"&gt;blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Recently I was exploring some source code and came across a code that implements a Mutex.&lt;/p&gt;

&lt;p&gt;Here's what it looks like (from &lt;a href="https://github.com/Kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-core/common/src/sync/Mutex.kt#L111"&gt;kotlinx-couroutines-core&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;    &lt;span class="nf"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;action&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I was wondering how they are going to release the mutex lock within the &lt;code&gt;finally&lt;/code&gt; block once the &lt;code&gt;return action()&lt;/code&gt; inside the &lt;code&gt;try&lt;/code&gt; block is executed.&lt;/p&gt;

&lt;p&gt;I never wrote a &lt;code&gt;finally&lt;/code&gt; block before, so this got me a little confused.&lt;/p&gt;

&lt;p&gt;A search revealed that many people have come across this situation. There's a &lt;a href="https://stackoverflow.com/q/65035/816416"&gt;question in StackOverflow&lt;/a&gt; which has around ~2.4k upvotes and bookmarked ~500 times.&lt;/p&gt;

&lt;p&gt;It is true. The &lt;code&gt;finally&lt;/code&gt; block gets executed always, except some unforeseen situations like the process getting killed, which is mentioned in the &lt;a href="https://stackoverflow.com/a/65049/816416"&gt;accepted answer&lt;/a&gt; in the StackOverflow question.&lt;/p&gt;

&lt;p&gt;I looked up in the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch"&gt;MDN documentation&lt;/a&gt; and found this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Note that the &lt;code&gt;finally&lt;/code&gt;-block executes regardless of whether an exception is thrown. Also, if an exception is thrown, the statements in the &lt;code&gt;finally&lt;/code&gt;-block execute even if no &lt;code&gt;catch&lt;/code&gt;-block handles the exception."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Let's try out a &lt;code&gt;try&lt;/code&gt; block!
&lt;/h3&gt;

&lt;p&gt;So I created a &lt;a href="https://jsbin.com/mucipov/edit?js,console"&gt;small JSBin snippet&lt;/a&gt; to test that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;tryExample&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Returned from try{}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Inside finally{}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tryExample&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This code will print:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inside finally{}
Returned from try{}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  One more thing, if the &lt;code&gt;finally&lt;/code&gt; returns something, then the &lt;code&gt;return&lt;/code&gt; within the &lt;code&gt;try&lt;/code&gt; block won't work.
&lt;/h2&gt;

&lt;p&gt;When I posted this on LinkedIn, my colleague &lt;a href="https://medium.com/@afsalms7"&gt;Afsal&lt;/a&gt; pointed out another interesting thing -- if we return from the &lt;code&gt;finally&lt;/code&gt; block, then the &lt;code&gt;return&lt;/code&gt; statement within the &lt;code&gt;try&lt;/code&gt; block won't execute.&lt;/p&gt;

&lt;p&gt;That was another discovery.&lt;/p&gt;

&lt;p&gt;I created &lt;a href="https://jsbin.com/xivupuh/edit?js,console"&gt;another JSBin snippet&lt;/a&gt; to test that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;finallyReturnsExample&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Returned from try{}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Inside finally{}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Returned from finally{}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;finallyReturnsExample&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The output will be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inside finally{}
Returned from finally{}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So a new lesson learned - &lt;strong&gt;the &lt;code&gt;finally&lt;/code&gt; block always executes (except for a few conditions) and if a &lt;code&gt;finally&lt;/code&gt; block returns, the &lt;code&gt;try&lt;/code&gt;/&lt;code&gt;catch&lt;/code&gt; won't return.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>java</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>Kotlin: What are your favorite extension functions that you authored? </title>
      <dc:creator>Vishnu Haridas</dc:creator>
      <pubDate>Tue, 01 Jan 2019 20:04:17 +0000</pubDate>
      <link>https://dev.to/vishnuharidas/kotlin-what-are-your-favorite-extension-functions-that-you-authored--5712</link>
      <guid>https://dev.to/vishnuharidas/kotlin-what-are-your-favorite-extension-functions-that-you-authored--5712</guid>
      <description>&lt;p&gt;&lt;em&gt;Also published on my blog here: &lt;a href="https://iamvishnu.com/posts/kotlin-extension-functions"&gt;https://iamvishnu.com/posts/kotlin-extension-functions&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kotlin has this nice feature called &lt;a href="https://kotlinlang.org/docs/reference/extensions.html"&gt;"Extension Functions"&lt;/a&gt; — adding new functionality to an existing class, without inheritance or writing lots of boilerplate code. Extension functions and extension properties are allowed in Kotlin.&lt;/p&gt;

&lt;p&gt;Here is an example Extension for the &lt;code&gt;Float&lt;/code&gt; class by adding a new function called &lt;code&gt;asDollars()&lt;/code&gt; to print that float number as a currency value:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun Float?.asDollars() = "USD%.2f".format(this ?: 0.0F)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now anywhere in code I can write:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;val money = 42.0F
println( money.asDollars() ) // will print "USD42.00"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; An extension function doesn't really modify the existing class. Instead, the receiver object is passed as the first parameter during compile time. For more, read: &lt;a href="https://kotlinlang.org/docs/reference/extensions.html#extensions-are-resolved-statically"&gt;Extension functions are resolved statically&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are some of my own Extensions that I use across many projects in Android:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Some AlertDialogs
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun Context.showAlertDialog(
    title: String,
    message: String,
    ok: Pair&amp;lt;String,()-&amp;gt;Unit&amp;gt;,
    cancel: Pair&amp;lt;String,()-&amp;gt;Unit&amp;gt;? = null){

    val builder = AlertDialog.Builder(this)
        .setTitle(title)
        .setMessage(message)
        .setCancelable(false)
        .setPositiveButton(ok.first) { _,_ -&amp;gt; ok.second() }

    cancel?.let{
        builder.setNegativeButton(it.first) { _, _ -&amp;gt; it.second() }
    }

    builder.create().show()
}

fun Context.showConfirmDialog(
    title: String,
    message: String,
    ok: Pair&amp;lt;String,()-&amp;gt;Unit&amp;gt;,
    cancel: Pair&amp;lt;String,()-&amp;gt;Unit&amp;gt;? = null
) = showAlertDialog(title, message, ok, cancel)

fun Context.showErrorDialog(message: String, action: () -&amp;gt; Unit){
    showAlertDialog(
        title = "Error",
        message = message,
        ok = "OK" to action
    )
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Usage on Activity (or Fragments):&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun onResume(){
    showAlertDialog(
        title = "Welcome",
        message = "Hello, welcome to the show! Do you want to proceed?",
        ok = "Yes" to { nextScreen() },
        cancel = "No" to { finish() }
    )

    // showing an error
    showError("No internet connection. Please try later") { finish() }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  2. A Simple Click Listener
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inline fun View.onClick(crossinline f: ()-&amp;gt; Unit) = this.setOnClickListener { f() }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Usage:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;btnNext.onClick { nextScreen() }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  3. Some &lt;code&gt;EditText&lt;/code&gt; validations
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun isValidText(s: String?) = s!=null &amp;amp;&amp;amp; !s.isEmpty()
fun isValidEmail(s: String?) = isValidText(s) &amp;amp;&amp;amp;  android.util.Patterns.EMAIL_ADDRESS.matcher(s).matches()

fun EditText.trimmedText() = this.text?.trim().toString()
fun EditText.isValidText() = isValidText(this.trimmedText())
fun EditText.isValidEmail() = isValidEmail(this.trimmedText())
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Usage:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isValidForm = editEmail.isValidEmail() &amp;amp;&amp;amp; editUsername.isValidText()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What are your favorite Extension Functions / Properties that you have authored for your projects?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
