Bahasa OO dapat digunakan sebagai pengganti bahasa tingkat rendah kadang-kadang untuk berinteraksi langsung dengan mesin. C ++ Tentu saja, tetapi bahkan untuk C # ada adapter dan semacamnya. Meskipun menulis kode untuk mengontrol bagian-bagian mekanik dan memiliki kontrol menit terhadap memori yang terbaik disimpan sedekat mungkin dengan level rendah. Tetapi jika pertanyaan ini terkait dengan perangkat lunak Berorientasi Objek saat ini seperti Line Of Business, aplikasi web, IOT, Layanan Web, dan sebagian besar aplikasi yang digunakan secara massal, maka ...
Jawab, jika berlaku
Pembaca mungkin mencoba bekerja dengan Arsitektur Berorientasi Layanan (SOA). Yaitu, DDD, N-Layered, N-Tiered, Hexagonal, apa pun. Saya belum melihat aplikasi bisnis besar yang secara efisien menggunakan OO "Tradisional" (Rekaman Aktif atau Model Kaya) seperti yang dijelaskan pada tahun 70-an dan 80-an dalam dekade terakhir +. (Lihat Catatan 1)
Kesalahannya bukan pada OP, tetapi ada beberapa masalah dengan pertanyaan itu.
Contoh yang Anda berikan hanya untuk menunjukkan polimorfisme, itu bukan kode produksi. Terkadang contoh persis seperti itu diambil secara harfiah.
Dalam FP dan SOA, Data dipisahkan dari Business Logic. Yaitu, Data dan Logika tidak berjalan bersama. Logika masuk ke Layanan, dan Data (Model Domain) tidak memiliki perilaku Polimorfik (Lihat Catatan 2).
Layanan dan Fungsi dapat bersifat Polimorfik. Di FP, Anda sering melewatkan fungsi sebagai parameter ke fungsi lain alih-alih nilai. Anda dapat melakukan hal yang sama dalam Bahasa OO dengan jenis-jenis seperti Callable atau Func, tetapi tidak merajalela (Lihat Catatan 3). Dalam FP dan SOA, Model Anda bukan Polimorfik, hanya Layanan / Fungsi Anda. (Lihat Catatan 4)
Ada contoh hardcoding yang buruk dalam contoh itu. Saya tidak hanya berbicara tentang benang merah "gonggongan anjing". Saya juga berbicara tentang CatModel dan DogModel sendiri. Apa yang terjadi ketika Anda ingin menambahkan Domba? Anda harus masuk ke kode Anda dan membuat kode baru? Mengapa? Dalam kode produksi, saya lebih suka melihat AnimalModel dengan propertinya. Paling buruk, AmphibianModel dan FowlModel jika properti dan penanganannya sangat berbeda.
Inilah yang saya harapkan untuk melihat dalam bahasa "OO" saat ini:
public class Animal
{
public int AnimalID { get; set; }
public int LegCount { get; set; }
public string Name { get; set; }
public string WhatISay { get; set; }
}
public class AnimalService : IManageAnimals
{
private IPersistAnimals _animalRepo;
public AnimalService(IPersistAnimals animalRepo) { _animalRepo = animalRepo; }
public List<Animal> GetAnimals() => _animalRepo.GetAnimals();
public string WhatDoISay(Animal animal)
{
if (!string.IsNullOrWhiteSpace(animal.WhatISay))
return animal.WhatISay;
return _animalRepo.GetAnimalNoise(animal.AnimalID);
}
}
Bagaimana Anda berpindah dari Kelas di OO ke Pemrograman Fungsional? Seperti yang orang lain katakan; Anda bisa, tetapi sebenarnya tidak. Poin di atas adalah untuk menunjukkan bahwa Anda seharusnya tidak menggunakan Kelas (dalam pengertian tradisional dunia) saat melakukan Java dan C #. Setelah Anda bisa menulis kode dalam Arsitektur Berorientasi Layanan (DDD, Layered, Tiered, Hexagonal, apa pun), Anda akan selangkah lebih dekat ke Fungsional karena Anda memisahkan Data Anda (Model Domain) Dari Fungsi Logis Anda (Layanan).
Bahasa OO selangkah lebih dekat ke FP
Anda bahkan mungkin membawanya sedikit lebih jauh dan membagi Layanan SOA Anda menjadi dua jenis.
Opsional Kelas Tipe 1 : Layanan Implementasi Antarmuka Umum untuk Titik Masuk. Ini akan menjadi Entry Point "tidak murni" yang dapat memanggil fungsionalitas lain "Murni" atau "Tidak Murni". Ini mungkin Poin Masuk Anda dari API ISTIRAHAT.
Opsional Kelas Tipe 2 : Layanan Logika Bisnis Murni. Ini adalah Kelas Statis yang memiliki fungsi "Murni". Dalam FP, "Murni" berarti tidak ada efek samping. Itu tidak secara eksplisit mengatur Negara atau Kegigihan di mana saja. (Lihat Catatan 5)
Jadi, ketika Anda memikirkan Kelas dalam Bahasa Berorientasi Objek, yang digunakan dalam Arsitektur Berorientasi Layanan, itu tidak hanya menguntungkan Kode OO Anda, itu mulai membuat Pemrograman Fungsional tampak sangat mudah dimengerti.
Catatan
Catatan 1 : Desain Berorientasi Objek "Kaya" atau "Rekaman Aktif" Asli masih ada. Ada BANYAK kode warisan seperti itu ketika orang "melakukannya dengan benar" satu dekade lalu atau lebih. Terakhir kali saya melihat kode semacam itu (dilakukan dengan benar) berasal dari video game Codebase di C ++ Di mana mereka mengendalikan memori dengan tepat dan memiliki ruang yang sangat terbatas. Bukan untuk mengatakan FP dan Arsitektur Berorientasi Layanan adalah binatang dan tidak boleh mempertimbangkan perangkat keras. Tetapi mereka menempatkan kemampuan untuk terus berubah, dipelihara, memiliki ukuran data variabel, dan aspek lainnya sebagai prioritas. Dalam video game dan AI mesin, Anda mengontrol sinyal dan data dengan sangat tepat.
Catatan 2 : Model Domain tidak memiliki Perilaku Polimorfik, juga tidak memiliki Ketergantungan Eksternal. Mereka "Terisolasi". Itu tidak berarti mereka harus 100% Anemik. Mereka dapat memiliki banyak logika yang terkait dengan konstruksi mereka dan perubahan properti yang bisa berubah, jika itu berlaku. Lihat DDD "Nilai Objek" dan Entitas oleh Eric Evans dan Mark Seemann.
Catatan 3 : Linq dan Lambda sangat umum. Tetapi ketika pengguna membuat fungsi baru, mereka jarang menggunakan Func atau Callable sebagai parameter, sedangkan di FP akan aneh melihat aplikasi tanpa fungsi mengikuti pola itu.
Catatan 4 : Tidak membingungkan Polimorfisme dengan Warisan. CatModel mungkin mewarisi AnimalBase untuk menentukan Properties mana yang biasanya dimiliki Animal. Tapi seperti yang saya tunjukkan, Model seperti ini adalah Code Smell . Jika Anda melihat pola ini, Anda dapat mempertimbangkan memecahnya dan mengubahnya menjadi data.
Catatan 5 : Fungsi murni dapat (dan melakukan) menerima fungsi sebagai parameter. Fungsi yang masuk mungkin tidak murni, tetapi mungkin murni. Untuk tujuan pengujian, itu akan selalu murni. Tetapi dalam produksi, meskipun diperlakukan sebagai murni, mungkin mengandung efek samping. Itu tidak mengubah fakta bahwa fungsi murni itu murni. Padahal fungsi parameternya mungkin tidak murni. Tidak membingungkan! : D