Builder Pattern

Jika kita memiliki sebuah class dengan banyak argument pada konstruktornya, kita bisa mempertimbangkan menggunakan Builder Pattern. Sebagai contoh

 

public Employee(string name, string carName, int paySheet, int carPrice, int saving, decimal monthlySaving,
           ITaxPaymentService taxPaymentService)
       {
           _name = name;
           _carName = carName;
           _paySheet = paySheet;
           _carPrice = carPrice;
           _saving = saving;
           _monthlySaving = monthlySaving;
           _taxPaymentService = taxPaymentService;
 
       }

kita bisa membuat sebuah class builder seperti ini.

 

public class EmployeeParam
   {
       
       public string Name { get; private set; }
       public int CarPrice { get; private set; }
       public string CarName { get; private set; }
       public int Saving { get; private set; }
       public decimal MonthySaving { get; private set; }
       public int PaySheet { get; private set; }
 
       public class Builder
       {
           private string _name;
           private int _carPrice;
           private string _carName;
           private decimal _monthySaving;
           private int _paySheet;
           private int _saving;
 
           public Builder WithName(string value)
           {
               _name = value;
               return this;
           }
 
           public Builder WithCarName(string value)
           {
               _carName = value;
               return this;
           }
 
           public Builder WithCarPrice(int value)
           {
               _carPrice = value;
               return this;
           }
 
           public Builder WithPaySheet(int value)
           {
               _paySheet = value;
               return this;
           }
 
           public Builder WithSaving(int value)
           {
               _saving = value;
               return this;
           }
 
           public Builder WithMonthlySaving(int value)
           {
               _monthySaving = value;
               return this;
           }
 
           public EmployeeParam Build()
           {
               return new EmployeeParam
               {
                   Name = _name,
                   CarName = _carName,
                   CarPrice = _carPrice,
                   MonthySaving = _monthySaving,
                   PaySheet = _paySheet,
                   Saving = _saving
               };
           }
       }
   }

 

Sekarang kita bisa memanggil class Employee dengan lebih readable seperti ini.

 

var richManBuilder = new EmployeeParam.Builder()
              .WithName("Rikki")
              .WithCarName("BMW")
              .WithPaySheet(40000000)
              .WithCarPrice(400000000)
              .WithSaving(120000000)
              .WithMonthlySaving(15000000)
              .Build();

 

Employee = new Employee(richManBuilder, _taxPaymentService);

 

 

Multi-Layer Arsitektur Menggunakan .Net Framework

Memenuhi salah satu resolusi saya tahun ini  yaitu belajar menulis buku, saya menyempatkan waktu untuk menulis di setiap akhir pekan. Setelah beberapa bulan,  akhirnya selesai juga buku yang sangat sederhana ini.

Buku kecil ini membahas tentang bagaimana menulis kode yang bersih, mudah di maintenance dan ditest dalam arsitektur N-tier klasik (Data Layer, Bussiness Logic Layer, dan Presentation Layer) dalam contoh yang sederhana. Dalam buku ini juga disertai contoh menulis unit test untuk tiap layer aplikasinya. Harapan saya semoga buku ini bermanfaat.

book_cover

Daftar isi.

daftar_isi_1daftar_isi_2

Bagi yang tertarik, silahkan tulis emailnya di form di bawah ini. Kenapa gak langsung saja? Soalnya saya butuh tahu siapa dan berapa orang yang membaca buku ini. Tak perlu bayar alias gratis, tapi kalau mau donasi juga gak apa-apa :D. Tolong untuk tidak didistribusikan demi keuntungan materi.

.Net Rasa NodeJs menggunakan Nancy

Setelah membaca beberapa tulisan mengenai Microservices yang banyak menggunakan Nancy. Saya jadi kepengen cari tahu Nancy itu seperti apa. Sekilas yang saya baca, Nancy ini terinspirasi dari kesederhanaan salah satu framework Ruby yaitu Sinatra. Nancy membuat kita bisa membuat sebuah Rest Api tanpa harus menggunakan Web Api pada .Net sehingga menjadi lebih sederhana dan mudah. Menurut saya sih, mirip ketika kita membuat Rest Api menggunakan NodeJs. Sebagai contoh kita membuat sebuah Nancy service yang running pada http://localhost:8888.

class Program
    {
        static void Main(string[] args)
        {
            var url = "http://localhost:8888";
 
            using (var host = new NancyHost(new Uri(url)))
            {
                host.Start();
                Console.WriteLine($"Listening in {url}");
                Console.ReadLine();
            }
        }
    }

nancy_app

Sekarang kita buat sebuat routing menggunakan NancyModule.

public class NancyMicroservices : NancyModule
    {
        public NancyMicroservices()
        {
            Get["angles"] = parameters =>
            {
                var angles = new object []
                {
                    new {
                        Name = "Raisa",
                        Occupation = "Singer"
                    },
                    new {
                        Name = "Isyana",
                        Occupation = "Singer"
                    },
 
                };
 
                return Response.AsJson(angles);
            };
 
        }

Buka browser :

nancy_response.png

Verb DELETE Return 405

Hari ini teman saya ada masalah, verb ‘Delete’ pada Web Api mengembalikan 405 pada server Dev. Akhirnya kami menemukan 2 solusi.

  1.  IIS-> click {nama_website} -> click Handler Mappings -> pilih WebDAV kemudian click button Request Restrictions. Pilih All Verbs

web_dav

  1. Pada WebConfig tambahkan handler pada <system.webServer>.
<modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule"/> <!-- add this -->
</modules>
 dan pada handle section, tambahkan
<handlers>
    <remove name="WebDAV" />
    ...
</handlers>

Akal vs Wahyu

Ada seorang laki-laki yang tersandung dan terjatuh ke dalam sebuah sumur. Untungnya dia sempat meraih sebuah akar yg kuat sehingga menghentikan jatuhnya.
Semakin lama, pegangannya semakin lemah dan dalam keputusasaannya dia berteriak, “Apakah ada orang di atas sana?”
Tiba-tiba sebuah sinar menerobos ke bawah meneranginya. Terdengar suara dari atas, “Saya, Tuhan, ada di sini. Lepaskan akarnya, dan saya akan menolongmu!”.
Laki-laki itu berpikir sejenak dan kemudian berteriak, “Adakah orang lain di atas sana?”.

Etika dan Hukum Ilahi

Malam ini saya membaca buku pengantar filsafat. Pada bab Etika, ketika membahas tentang bagaimana hukum Ilahi menyederhanakan etika. Muncul pertanyaan, bagaimana kita yakin bahwa yang tertulis di kitab suci secara harfiah (tekstual) adalah maksud Tuhan yang sebenarnya?

Saya langsung teringat kisah yang sering dikhutbahkan ketika hari Kurban. Tentang bagaimana Nabi Ibrahim as mendapatkan perintah dari Tuhan lewat mimpinya untuk menyembelih anak kesayangannya Ismail as atau dilain versi Ishaq as. Perintah ini walaupun secara etika tidak masuk akal dan terkesan ‘gila’ karena merampas hak hidup, Ibrahim walaupun berat hati tetap melaksanakannya. Tindakan Ibrahim ini adalah bukti bahwa ketaatannya kepada Tuhan lebih besar daripada kasih sayangnya kepada anak. Kemudian ternyata, Tuhan menggantikan kurbannya dengan seekor domba.
Nah, ada yang menarik. Saya pernah baca bahwa Ibnu Arabi -seorang filsuf dan sufi besar berpendapat bahwa seandainya Ibrahim as melakukan takwil atas mimpinya, dia bisa menangkap pesan metaforis dari Tuhan bukannya arti harfiahnya, maka perintah ini tidak akan berat dan berkesan seolah melanggengkan tradisi pagan yang mengurbankan jiwa manusia.

Wallahu A’lam Bishawab.

Binding ListView using MvvmCross in Xamarin

Melanjutkan project pada tulisan MVVM Pattern in Xamarin Project using MvvmCross.

Kita buat sebuah class Book di Portable project.

public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Image { get; set; }
public string Author { get; set; }
public decimal Price { get; set; }
public int Year { get; set; }
}

Kemudian kita buat lagi sebuah ViewModel. ViewModel yang digunakan pada ListView harus berisi setidaknya sebuah ObservableCollection. Di konstruktor kita inisialisasi data untuk ObservableCollection Items.

public class BookViewModel : MvxViewModel
{
public ObservableCollection Items { get; set; }
public BookViewModel()
{
Items = new ObservableCollection();
Items.Add(
new Book
{
Id = 1,
Title = "Lord Of The Ring",
Author = "JJR. TOLKIEN",
Price = 40,
Year = 2001,
Image = "https://luckty.files.wordpress.com/2012/05/b32.jpg"
});
Items.Add(
new Book
{
Id = 2,
Title = "The Hobbit",
Author = "JJR. TOLKIEN",
Price = 35,
Year = 2014,
Image = "https://images-na.ssl-images-amazon.com/images/I/41aQPTCmeVL._SX331_BO1,204,203,200_.jpg"
});

}
}

Selanjutanya pada project .Droid (android) kita buat sebuah Layout (.axml), sebagai contoh kita beri nama BookListView.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Mvx.MvxListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        local:MvxItemTemplate="@layout/row_layout"
        local:MvxBind="ItemsSource Items">
</LinearLayout>

Perhatikan local:MvxBind=”ItemsSource Items”, artinya kita melakukan Binding data pada ListView dari property Items pada class Book. Sedangkan  untuk menentukan template pada ListView kita gunakan  local:MvxItemTemplate.

Pada folder Layout buat sebuah AndroidLayout (.axml) dengan nama row_layout.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="8dp">
    <LinearLayout
        android:id="@+id/Text"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dip">
        <TextView
            android:id="@+id/Text2"
            android:layout_width="wrap_content"
            android:layout_height="15.0dp"
            android:textSize="14dip"
            android:paddingLeft="100dip"
            local:MvxBind="Text Title" />
    </LinearLayout>
    <Mvx.MvxImageView
        android:layout_width="78.0dp"
        android:layout_height="82.5dp"
        android:padding="5dip"
        local:MvxBind="ImageUrl Image" />
</RelativeLayout>

Perhatikan kita melakukan binding Image dengan menggunakan; ItemLongClick ShowInfo”local:MvxBind=”ImageUrl Image” yang artinya ImageUrl pada grid di set dari properti Image pada class Book.

Selanjutnya kita buat sebuah activity yang merupakan turunan dari  MvxActivity kemudian pada generic parameternya kita set model yang akan dipanggil yaitu BookViewModel. Jangan lupa set content viewnya dari Layout BookListView.

[Activity(Label = "Book List", MainLauncher = true)]
public class BookView : MvxActivity<BookViewModel>
{
protected override void OnViewModelSet()
{
base.OnViewModelSet();
SetContentView(Resource.Layout.BookListView);
}
}

Kita running emulator android kita

mvvm_book_emulator.png

Sekarang kita tambahkan event ketika ListView item di click dengan agak lama. Event ini akan memunculkan user dialog alert info tambahan dari Book. Kita tambahkan sebuah ICommand property pada class Book.

public ICommand ShowInfo
{
get
{
return new MvxCommand(b => Mvx.Resolve().Alert(GetInfo(b)));
}

}

protected string GetInfo(Book book)
{
var output = new StringBuilder();
output.Append($"Author: {book.Author}");
output.AppendLine();
output.Append($"Year: {book.Year}");
output.AppendLine();
output.Append($"Price: {book.Price}");
return output.ToString();
}

ShowInfo kita bind sebagai event ketika ListView item click sehingga layout dari BookListView jadi seperti ini.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Mvx.MvxListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        local:MvxItemTemplate="@layout/row_layout"
        local:MvxBind="ItemsSource Items; ItemLongClick ShowInfo" />
</LinearLayout>

Untuk UserDialog kita menggunakan plugin ACR User Dialogs. Install lewat Nuget package manager console.

PM > Install-Package Acr.UserDialogs

Jangan lupa pada class App.cs di .Portable project register instance dari IUserDialog.

Mvx.RegisterSingleton(UserDialogs.Instance);

_user_dialog_xamarin.png