Pemformatan kode: Meletakkan fungsi berdasarkan hirarki panggilan dalam file kelas?

10

Sebuah saran dari "Kode Bersih" Bob Martin membuat saya menggaruk-garuk kepala .. "Jika suatu fungsi memanggil yang lain, mereka harus dekat secara vertikal dan pemanggil harus berada di atas callee"

Sejauh ini, saya telah sedikit banyak menempel pada pedoman .Net, yang mengelompokkan anggota kelas berdasarkan jenis (properti, ctors, fungsi) dan visibilitas (publik / prot / privat). Tip ini nampak seperti masalah pada awalnya .. tetapi "mungkin saja berhasil". Saya pribadi telah menemukan kasus di mana saya menyukai tata letak ini - lebih mudah untuk menelusuri ketika Anda berada di rantai panggilan yang tepat.

Gagasan di balik tip ini tampaknya masuk akal tetapi skenario lain seperti "biarkan saya melihat antarmuka publik kelas ini" mungkin menjadi lebih buruk. Mungkin Paman Bob mengandalkan kelas kecil dan dukungan IDE untuk jenis menonton ...

Adakah yang sudah mencoba ini dalam waktu lama?

Pembaruan: Sepertinya potongan kode sedang berurutan

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}
Gishu
sumber
2
"Paman Bob" yang mengerikan itu bukan pensil paling tajam di dalam kotak.
Neil Butterworth
1
Idenya adalah "beri saya gambaran besar sebelum detail seluk beluk". Adaptasi seperlunya.
Ryan Culpepper
2
Elang pasti semakin dekat untuk kembali lagi, karena aku mendapati diriku setuju dengan komentar Neil. Saya tumbuh bersama PASCAL dan "mengutamakan hal-hal kecil" karena PASCAL mengkompilasi semua hal yang diperlukan untuk didefinisikan sebelum direferensikan, dan deklarasi FORWARD pada umumnya disukai.
John R. Strohm
@ Neil - Saya mencoba menilai pantasnya saran .. terlepas dari sumbernya. @ John - dan ujungnya adalah kebalikan dari deklarasi maju .. Anda menempatkan penelepon dulu .. callee dinyatakan tepat di bawah penelepon.
Gishu
@ryanc - bagian awal paragraf tersebut menekankan bahwa konsep "terkait erat / kohesif" harus berdekatan secara vertikal [Mencegah bergulir saat Anda mencoba mencari sesuatu]. Fungsi yang dipanggil diletakkan di bawah penelepon dalam urutan panggilan. Lihat potongan kode tambahan
Gishu

Jawaban:

2

Saya mungkin akan mengambil risiko di sini, tapi saya ingin tahu apakah alat yang Anda gunakan berdampak pada ini. Saya merujuk pada editor teks versus keputusan IDE yang harus dibuat pengembang.

Dalam IDE, Anda memiliki lebih banyak fungsi untuk melihat file sumber. Biasanya, Anda bisa mendapatkan daftar metode yang diurutkan berdasarkan abjad, berdasarkan visibilitas, atau bahkan mengembalikan jenis di bilah sisi. Anda juga dapat melompat ke suatu metode jika Anda menggunakannya. Anda juga dapat membuat pohon panggilan untuk metode dan menelusuri. Anda juga biasanya memiliki perintah find yang kuat yang mungkin mendukung ekspresi reguler. Dalam situasi ini, urutan metode yang Anda buat benar-benar tidak masalah karena Anda memiliki pandangan selain kode sumber yang tersedia.

Dalam editor teks, Anda biasanya tidak memiliki fitur-fitur ini - yang terdekat dengan yang Anda miliki mungkin adalah penemuan / penggantian yang kuat. Di sini, Anda akan ingin lebih memperhatikan struktur file Anda karena mungkin lebih sulit untuk dinavigasi. Anda ingin meminimalkan waktu yang dihabiskan untuk mencari file yang Anda cari, dan urutan metode yang konsisten dan logis dapat membantu.

Thomas Owens
sumber
+1 untuk IDE; semakin baik IDE, semakin sedikit orang perlu khawatir tentang hal-hal seperti itu
user281377
1

Intinya adalah bahwa hal-hal yang disebut lebih menarik daripada memanggil hal-hal. Semakin banyak metode memanggil metode lain, semakin besar kemungkinan bahwa metode tersebut adalah bagian dari API eksternal objek (bukan sebagai detail implementasi). Itu berarti API eksternal kelas - metode publik, jika bahasa Anda mendukung konsep itu - secara alami "ingin" berada di bagian atas file, membuatnya lebih mudah untuk menemukan metode itu. Sebaliknya, fungsi pembantu dan semacamnya akan "ingin" berada di bagian bawah file.

(Saya menjelaskan konsepnya, tidak mengevaluasi keefektifannya.)

Frank Shearar
sumber
Ya tapi itu akan menyiratkan semua fungsi publik harus mengapung ke atas file sebagai satu grup yaitu. pendekatan konvensional. Pendekatan yang diusulkan berbeda (atau setidaknya bagaimana saya membacanya) .. lihat pembaruan yang dipermasalahkan
Gishu
Ya memang, fungsi publik Anda harus melayang ke atas. Tentu saja beberapa bahasa tidak memiliki pengubah visibilitas sama sekali ...
Frank Shearar
1

Jika dengan jangka waktu yang Anda maksud selama lebih dari beberapa hari? Lalu Tidak
. Beberapa tahun yang lalu saya mulai melakukan ini pada beberapa kode baru, dan perlahan-lahan membuat diri saya gila, sampai saya berhenti.

Preferensi pribadi saya untuk meletakkan kelas adalah

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

Tapi itu bukan agama, properti dan metode bisa dicampur bersama. Visibilitas tidak masuk ke dalamnya (saya tidak mengelompokkan berdasarkan publik / dilindungi / pribadi)

Kami memiliki seorang lelaki di kantor ini yang memiliki struktur ketat dalam segala hal di file kelas, dengan semua yang dikelompokkan bersama dalam grup utama dan sub grup, semuanya tersarang dengan baik di kawasan. . . Saya harus mengakui bahwa saya pikir wilayah adalah pekerjaan Setan, mereka membuat saya berputar-putar.

Setiap kali saya membuka salah satu kelasnya, saya mati sedikit di dalam :(

Biner Terburuk
sumber
Saya tidak menganjurkan kelas besar dengan daerah yang ditambahkan untuk menutupi bau. Bukan mencoba untuk menjadi religius .. tetapi memiliki tata letak yang konsisten dalam suatu proyek mempercepat hal-hal - mengetahui ke mana harus mencari. Mengelompokkan visibilitas sebagai manfaat tambahan memiliki API publik berdekatan sehingga Anda dapat menemukan titik masuk spesifik dan menelusuri dari sana ...
Gishu
Dan konstruktor? Itu masuk "metode"?
Cody Grey
@Cody Grey: Permintaan maaf, lupa ctors!
Binary Worrier
@ Gishu: Saya menemukan alat visualisasi dan navigasi modern telah menghilangkan kebutuhan akan tata letak file yang ketat. Apakah penting di mana metode diterapkan ketika saya bisa mengklik kanan penggunaan dan "Pergi ke Definisi"?
Binary Worrier