Baik sebagai programmer C dan programmer C #, salah satu hal yang saya tidak suka tentang C # adalah bagaimana fungsi matematika verbose. Setiap kali Anda harus menggunakan fungsi Sin, cosine, atau power, misalnya, Anda harus menambahkan kelas statis Matematika. Ini mengarah ke kode yang sangat panjang ketika persamaan itu sendiri cukup sederhana. Masalahnya menjadi lebih buruk jika Anda perlu mengetikkan tipe data. Akibatnya, menurut pendapat saya, keterbacaan menderita. Sebagai contoh:
double x = -Math.Cos(X) * Math.Sin(Z) + Math.Sin(X) * Math.Sin(Y) * Math.Cos(Z);
Berbeda dengan sederhana
double x = -cos(X) * sin(Z) + sin(X) * sin(Y) * cos(Z);
Ini juga terjadi di bahasa lain seperti Jawa.
Saya tidak yakin apakah pertanyaan ini benar-benar memiliki solusi, tetapi saya ingin tahu apakah ada trik C # atau programmer Java yang digunakan untuk meningkatkan keterbacaan kode Matematika. Namun saya menyadari bahwa C # / Java / etc. bukan bahasa yang berorientasi matematika seperti MATLAB atau sejenisnya, jadi masuk akal. Tetapi kadang-kadang orang masih perlu menulis kode matematika dan itu akan bagus jika seseorang bisa membuatnya lebih mudah dibaca.
sumber
using System.Math; … double x = -Cos(X) * Sin(Z) + Sin(X) * Sin(Y) * Cos(Z);
.Jawaban:
Anda dapat menentukan fungsi lokal yang memanggil fungsi statis global. Semoga kompiler akan memberikan pembungkus sejajar, dan kemudian kompiler JIT akan menghasilkan kode perakitan yang ketat untuk operasi yang sebenarnya. Sebagai contoh:
Anda juga bisa membuat fungsi yang menggabungkan operasi matematika umum menjadi operasi tunggal. Ini akan meminimalkan jumlah kejadian di mana fungsi suka
sin
dancos
muncul dalam kode Anda, sehingga membuat kekeraskepalaan memanggil fungsi statis global kurang terlihat. Sebagai contoh:Anda bekerja pada level titik dan rotasi, dan fungsi trigonometri yang mendasarinya dikubur.
sumber
Di Jawa, ada banyak alat yang tersedia untuk membuat hal-hal tertentu kurang bertele-tele, Anda hanya perlu menyadarinya. Salah satu yang berguna dalam hal ini adalah
static
impor ( halaman tutorial , wikipedia ).Pada kasus ini,
berjalan cukup baik ( ideone ). Agak berat untuk melakukan impor statis semua kelas Matematika, tetapi jika Anda melakukan banyak matematika, maka mungkin diperlukan.
Impor statis memungkinkan Anda untuk mengimpor bidang atau metode statis ke namespace kelas ini dan menjalankannya tanpa memerlukan nama paket. Anda sering menemukan ini di Junit uji kasus di mana
import static org.junit.Assert.*;
ditemukan untuk mendapatkan semua menegaskan tersedia.sumber
public interface Constants { final static public double PI = 3.14; }
dan kemudianpublic class Foo implements Constants
di semua kelas untuk mendapatkan akses ke konstanta di antarmuka. Ini membuat kekacauan besar . Jadi, dengan 1.5, impor statis ditambahkan untuk memungkinkan menarik konstanta tertentu dan fungsi statis tanpa harus mengimplementasikan antarmuka.import static java.lang.Math.cos;
Dengan C # 6.0 Anda dapat menggunakan fitur Impor Statis.
Kode Anda bisa:
Lihat: Pernyataan Penggunaan Statis (Pratinjau Bahasa AC # 6.0)
EDIT: Sejak Visual Studio 2015, CTP dirilis pada Januari 2015, impor statis memerlukan kata kunci eksplisit
static
. Suka:sumber
Selain jawaban baik lainnya di sini, saya mungkin juga merekomendasikan DSL untuk situasi dengan kompleksitas matematika yang substansial (bukan kasus penggunaan rata-rata, tetapi mungkin beberapa proyek keuangan atau akademik).
Dengan alat generasi DSL seperti Xtext , Anda bisa menentukan tata bahasa matematika sederhana Anda sendiri, yang pada gilirannya dapat menghasilkan kelas dengan berisi representasi Java (atau bahasa lain) dari rumus Anda.
Ekspresi DSL:
Output yang dihasilkan:
Dalam contoh sederhana seperti itu, manfaat membuat tata bahasa dan plugin Eclipse tidak akan bermanfaat, tetapi untuk proyek yang lebih rumit, itu bisa menghasilkan manfaat besar, terutama jika DSL memungkinkan pelaku bisnis atau peneliti akademis untuk menjaga dokumen formal dengan nyaman bahasa, dan yakinlah bahwa pekerjaan mereka diterjemahkan secara akurat ke dalam bahasa implementasi proyek.
sumber
Di C # Anda bisa menggunakan metode ekstensi.
Di bawah ini terbaca cukup baik setelah Anda terbiasa dengan notasi "postfix":
Sayangnya operator diutamakan membuat hal-hal sedikit lebih buruk ketika berhadapan dengan angka negatif di sini. Jika Anda ingin menghitung
Math.Cos(-X)
alih-alih,-Math.Cos(X)
Anda harus menyertakan nomor dalam tanda kurung:sumber
x.Sin()
akan mengambil beberapa penyesuaian, tetapi saya menyalahgunakan metode ekstensi dan ini akan, secara pribadi, kecenderungan pertama saya.C #: Variasi pada jawaban Randall Cook , yang saya suka karena mempertahankan tampilan "matematis" kode lebih dari metode ekstensi, adalah dengan menggunakan pembungkus tetapi menggunakan referensi fungsi untuk panggilan daripada membungkusnya. Saya pribadi berpikir itu membuat kode terlihat lebih bersih, tetapi pada dasarnya melakukan hal yang sama.
Saya mengetuk program uji LINQPad kecil termasuk fungsi dibungkus Randall, referensi fungsi saya, dan panggilan langsung.
Fungsi panggilan referensi pada dasarnya mengambil waktu yang sama dengan panggilan langsung. Fungsi yang dibungkus secara konsisten lebih lambat - meskipun tidak dalam jumlah besar.
Ini kodenya:
Hasil:
sumber
Gunakan Scala! Anda dapat menentukan operator simbolik, dan Anda tidak perlu parens untuk metode Anda. Hal ini membuat matematika cara yang lebih mudah untuk menafsirkan.
Misalnya, perhitungan yang sama di Scala dan Java bisa jadi seperti:
Ini bertambah dengan cukup cepat.
sumber