Bagaimana cara mendokumentasikan struktur tingkat tinggi dari program Java?

20

Latar Belakang: Kolaborator saya dan saya sedang menulis artikel untuk jurnal akademik. Dalam perjalanan penelitian kami, kami menulis sebuah program simulasi di Jawa. Kami ingin membuat program simulasi tersedia secara bebas untuk digunakan orang lain. Kami telah memutuskan untuk meng-hosting kode pada repositori GitHub. Agar mudah digunakan orang lain, kami ingin menulis dokumentasi yang baik untuk program kami, termasuk:

  • Javadocs untuk setiap kelas dan metode
  • Cara menggunakan kode
  • Menjelaskan struktur kode tingkat tinggi

Pertanyaan tingkat tinggi saya adalah: Bisakah Anda memberikan contoh yang baik dari kata-kata dan diagram yang dapat digunakan untuk menggambarkan struktur tingkat tinggi dari suatu program? Ini termasuk sebagai sub-pertanyaan:

  1. Bagaimana kita menunjukkan kelas apa yang terkandung dalam paket mana?
  2. Bagaimana kita menunjukkan paket apa yang bergantung pada paket lain?
  3. Bagaimana kita menunjukkan bagaimana objek / kelas dalam program bekerja bersama?
  4. Kami telah mencoba menggunakan prinsip-prinsip desain berbasis domain dalam desain kode saya. Bagaimana kami menunjukkan korespondensi antara objek dalam domain dan file kode sumber tertentu yang menyandikan objek ini? (Lihat deskripsi "bahasa di mana-mana" tentang proyek di bawah ini.)

Apa yang telah saya lakukan sejauh ini

Bahasa di mana-mana

Kami menempatkan deskripsi "bahasa di mana-mana" kode dalam file ubiquitous-language.md, konten di bawah ini.

Tujuan dari proyek ini adalah untuk mempelajari seberapa baik kinerja kebijakan pengisian dalam rantai pasokan sederhana dengan fasilitas tunggal, di bawah model lead time yang berbeda, penundaan laporan dan model permintaan.

Di setiap periode, peristiwa berikut terjadi:

  1. Jika pengiriman dijadwalkan tiba di fasilitas pada periode saat ini, maka tingkat persediaan fasilitas bertambah oleh X unit.
  2. Jika jadwal menunjukkan bahwa periode saat ini adalah periode pelaporan, maka fasilitas menyerahkan laporan kepada pemasok . The pemasok mungkin menerima laporan seketika, atau dengan penundaan beberapa minggu, sebagaimana ditentukan oleh jadwal .
  3. Jika pemasok telah menerima laporan , maka berdasarkan kebijakan pengisian , itu akan menghitung jumlah pengisian unit X. Sebuah pengiriman unit X dari produk yang akan dijadwalkan tiba setelah waktu memimpin periode l.
  4. Pelanggan tiba di fasilitas dan meminta unit X produk. Permintaan yang tidak terpenuhi hilang.

Struktur Kode Sumber

Kami menempatkan deskripsi "tingkat tinggi" kode yang tidak lengkap dalam file structure.md, konten di bawah ini.

Struktur Tingkat Paket

Pada level tertinggi, kode sumber disusun dalam tiga paket

  • com.gly.sfs Kelas utama dengan mainmetode berada di paket ini.
  • com.gly.sfs.model Kelas-kelas model domain berada dalam paket ini.
  • com.gly.sfs.util Kelas pembantu berada di paket ini.
Saya Suka Kode
sumber
ketika Anda mengatakan "struktur kode tingkat tinggi," apakah Anda hanya bermaksud kelas mana yang ada dalam paket mana? Anda bisa melakukannya dengan menggambar garis putus-putus di sekitar kelas-kelas dalam diagram kelas Anda yang termasuk dalam paket tertentu, dan memberi label garis putus-putus dengan nama paket. Cukup mudah untuk menemukan contoh diagram kelas .
Robert Harvey
Alat peraga besar untuk merilis kode akademik.
Felix
@ RobertTarvey Lihat hasil edit saya untuk pertanyaan. Menunjukkan kelas mana di mana paket lebih mudah, menunjukkan bagaimana kelas bekerja bersama lebih rumit.
Saya Suka Kode
1
Anda mungkin ingin menambahkan javadoc tingkat paket juga.
haylem

Jawaban:

4

Biasanya , Anda akan menggunakan UML untuk tujuan yang Anda jelaskan. UML pada dasarnya dipecah menjadi dua jenis diagram: struktural dan perilaku.

Diagram struktural meliputi: komposisi, penyebaran, paket, kelas, objek, dan komponen. Diagram perilaku meliputi: urutan, mesin keadaan, komunikasi, use case, aktivitas, dan gambaran umum interaksi.

Bergantung pada apa yang ingin Anda sampaikan, Anda memilih beberapa diagram yang paling mewakili apa pun yang ingin Anda sampaikan, dan dengan melakukan itu Anda membiarkan percakapan untuk "naik satu tingkat". Alih-alih berbicara tentang metode, parameter, dan kode, Anda berbicara tentang urutan interaksi, atau dependensi kelas statis, atau diagram apa pun yang Anda pilih untuk dibuat.

Saya telah melampirkan contoh diagram urutan (salah satu diagram perilaku). Saya pribadi suka diagram urutan karena itu tepat di tengah proses artefak desain - kira-kira jumlah diagram yang sama tergantung padanya seperti yang diharapkan sebagai input. Saya menemukan bahwa diagram input biasanya "dipahami", atau diagram urutan sudah menyiratkan keberadaan mereka. Namun, kadang-kadang saya melakukan kedua diagram kelas statis dan diagram urutan (satu diagram struktural dan satu diagram perilaku).

http://omarfrancisco.com/wp-content/uploads/2011/07/ berikutnyaencediagram.png

Saya belum pernah melihat diagram ini sebelumnya dalam hidup saya, tetapi saya bisa mengatakan sejumlah hal tentang sistem ini. Ada empat komponen utama (kata benda di sistem Anda - biasanya kelasnya): View, Controller, Proxy Data, dan Penyedia Data. Panah adalah "perilaku" atau doa metode. Diagram urutan pada dasarnya baik untuk menunjukkan interaksi penting tunggal antara sekelompok komponen. Anda memiliki satu diagram urutan untuk setiap aliran penting melalui sistem Anda. Saya dapat mengatakan dari diagram khusus ini bahwa "Pengontrol" memperlihatkan metode yang disebut "phoneIsComplete ()", yang pada gilirannya tergantung pada metode "lookupPhone ()" DataProviderProxy, yang pada gilirannya tergantung pada metode "lookupPhone ()" DataProvider.

Sekarang, Anda mungkin mengerang dan berpikir "uggg ... ini tidak memberi saya gambaran besar tentang sistem - itu hanya interaksi individu melalui sistem". Tergantung pada kecanggihan sistem, hal itu mungkin menjadi perhatian yang valid (sistem sederhana pasti dapat bertahan hanya dengan koleksi diagram urutan). Jadi, kita beralih ke diagram struktural dan kita melihat sesuatu seperti diagram kelas statis:

http://www.f5systems.in/apnashoppe/education//img/chapters/uml_class_diagram.jpg

Diagram kelas membantu kita mengetahui dua hal penting: kardinalitas, dan tipe hubungan kelas. Kelas dapat dihubungkan satu sama lain dengan cara yang berbeda: asosiasi, agregasi, dan komposisi. Secara teknis, ada perbedaan antara "hubungan kelas statis" dan "hubungan contoh". Namun, dalam praktiknya Anda melihat garis-garis ini kabur. Perbedaan utama adalah bahwa hubungan kelas statis biasanya tidak termasuk kardinalitas. Mari kita lihat contoh di atas dan lihat apa yang bisa kita lihat. Pertama, kita dapat melihat bahwa "Pesanan Khusus" dan "Pesanan Normal" adalah subtipe dari "Pesanan" (warisan). Kita juga dapat melihat bahwa satu Pelanggan memiliki N Pesanan (yang mungkin "Pesanan Normal", "Pesanan", atau "Pesanan Khusus") - objek Pelanggan tidak Aku benar-benar tahu. Kita juga dapat melihat sejumlah metode (di bagian bawah setiap kotak kelas) dan properti (bagian atas dari setiap kotak kelas).

Saya bisa terus berbicara tentang diagram UML untuk waktu yang lama, tetapi ini adalah dasar-dasarnya. Semoga itu bisa membantu.

TLDR; Pilih satu diagram UML perilaku dan satu struktural, pelajari cara membuatnya, dan Anda akan mencapai apa yang ingin Anda capai.

Calphool
sumber
18

Jika Anda mengalami kesulitan menggambarkan hal-hal seperti bagaimana struktur tingkat tinggi dari program Anda bekerja, dan bagaimana kelas bekerja dengan baik bersama, pertimbangkan pepatah berikut:

A picture is worth a thousand words.

Cara Anda melukis gambar tentang kode adalah dengan memberikan contoh kode. Banyak dari mereka. Ini adalah bagaimana Anda membuat pelanggan baru (kode). Ini adalah bagaimana Anda memproses pesanan (kode). Ini tidak hanya memberi konsumen kode Anda tempat untuk memulai, tetapi juga menggambarkan bagaimana semua objek saling terhubung dan berinteraksi. Jika saya menggunakan kode Anda, bantuan terbesar yang dapat Anda lakukan untuk saya adalah menyediakan banyak sampel kode.

Cara Anda melukis gambar untuk pengguna akhir adalah dengan memberikan tangkapan layar. Banyak dari mereka. Tangkapan layar setelah tangkapan layar yang menggambarkan, jika Anda ingin melakukan tugas ini, inilah yang Anda lakukan pertama kali, ini yang Anda lakukan selanjutnya, dll.

Robert Harvey
sumber
+1, contoh kode dari tugas umum adalah hal pertama yang ingin dipelajari oleh seseorang tentang API. Javadocs dan beberapa deskripsi hubungan antar kelas akan mengisi kekosongan, tetapi tidak cukup.
Doval
6
+1 karena tidak menyebutkan UML.
Doc Brown
3
@DocBrown UML jelas bukan alat untuk setiap pekerjaan. Namun , jika Anda memodelkan sesuatu yang sesuai dengan pola salah satu diagram UML (misalnya, memodelkan hubungan kelas), maka UML memang menawarkan format yang mungkin akrab bagi pembaca, dan keakraban memudahkan keterbacaan.
Kat
@DocBrown Mengapa UML menjadi solusi yang buruk dalam kasus ini?
Onno
@ Onno: ini agak ironis, tapi saya pikir UML hanya memiliki dukungan terbatas untuk deskripsi "tingkat tinggi", dan semantik yang sangat tidak jelas. Tapi saya kira menggunakan diagram paket akan baik-baik saja di sini (selama alat UML akan memungkinkan untuk menggambar kelas dalam paket).
Doc Brown
3

UML, yang sering digunakan untuk memodelkan perangkat lunak sebelum dibuat, dapat bermanfaat. Ada beberapa diagram berbeda yang mengilustrasikan kasus penggunaan, interaksi kelas, dll. Anda dapat melihatnya lebih lanjut di sini .

harga
sumber
1

Saya menemukan https: //www.web berikutnyaencediagrams.com/ alat yang sangat berguna untuk menggambarkan interaksi antara komponen dalam aplikasi, atau antara layanan dalam aplikasi terdistribusi. Itu hanya membuat proses membuat dan memelihara diagram urutan UML jauh lebih mudah.

Yang menyenangkan adalah, jika Anda menganggap setiap jalur hidup sebagai antarmuka atau kelas dalam aplikasi Anda (saya biasanya hanya memodelkan pemain besar), maka setiap baris yang mengalir ke kelas itu merupakan metode yang harus Anda dukung.

Selain itu, ada beberapa opsi unduhan untuk mendapatkan gambar. Ada juga beberapa cara mudah untuk menanamkan diagram dalam wiki. Jadi itu adalah alat komunikasi yang bagus untuk menggambarkan interaksi antara komponen atau layanan dalam suatu sistem, serta mengkomunikasikannya dengan tim.

rampok
sumber