Apakah dapat diterima untuk mendeklarasikan objek dengan tipe yang sama, di dalam dirinya?

8

Apakah dapat diterima untuk mendeklarasikan objek baru (dan mengembalikannya) dari dalam objek yang sama, seperti dalam contoh di bawah ini?

Atau, lebih baik memindahkannya ke semacam handlerkelas?

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    //Gets a list of persons
    public List<Person> GetPersons()
    {
        List<Person> _listPersons = new List<Person>();

        Person _person = new Person();
        _person.Name = "FooFii"; 
        _person.Age = 50;
        _listPersons.Add(_person); 

        return _listPersons; 
    }
}
AsusT9
sumber
6
tergantung pada bahasa, saya akan merekomendasikan GetPersonsmenjadi statis atau bukan anggota Person. Saat ini Anda perlu PersonmeneleponGetPersons
Caleth
Tentu, Objectkelas Java (akar hierarki kelas) secara eksplisit mengamanatkan clone()metode yang dimaksudkan untuk menyediakan salinan objek.
TMN

Jawaban:

9

Secara umum, ya tidak apa-apa . Secara umum konstruktor suatu kelas adalah tempat semua pengaturan yang diperlukan agar kelas berfungsi. Seringkali sebagian dari pengaturan itu diabstraksi ke area kode yang lain. Misalnya pola pabrik memindahkan banyak pengaturan awal ke kelas lain sehingga pengaturannya jelas dipisahkan dari logika.

Dalam contoh spesifik Anda, itu tidak masalah . Mungkin karena contoh Anda dibuat tetapi Anda menyatukan data dan logika. Anda menyatakan seperti apa rupa seseorang dan memberi saya metode bagaimana mendapatkan orang tertentu. Ada baiknya melihat Prinsip Tanggung Jawab Tunggal . Dalam contoh Anda, saya akan memiliki satu kelas sederhana yang mendefinisikan tipe data Orang, sebuah repositori yang membuat orang dan kelas yang membuat orang keluar dari repositori dan kemudian melakukan sesuatu dengan data (yaitu mengirim email kepada mereka)

Tom Squires
sumber
5

Ya, dalam kondisi yang tepat.

Contoh umum adalah komposisi filter. Di sini, Anda membuat filter baru dengan memanggil metode pada filter yang lebih lama.

Contoh buatan:

class Filter {
    public function where(string field_name, object value) {
        filters = (clone)this->filters;
        filters.setitem(field_name, value);
        return Filter(filters);
    }
}

Ini memungkinkan penggunaan seperti

query = Filter()
    .where("username", "nobody")
    .where("password", "should be salted and hashed")
;
user = User.get(filter);

Ini agak bagaimana chaining selector jQuery bekerja, dan bagaimana querysets Django bekerja.

Sjoerd Job Postmus
sumber
3

Alih-alih melakukannya dengan cara ini, saya akan mencoba menerapkan sesuatu seperti versi yang lebih dienkapsulasi dari pola pabrik. Miliki objek terpisah yang membuat daftar. Lihat Pabrik (pemrograman berorientasi objek) .

Anda pada dasarnya sudah melakukan pola pabrik ketika Anda mengembalikan daftar Person, tetapi Anda mungkin ingin memiliki dua kelas yang terpisah. Jika Anda memisahkan pabrik dari produk , penerapan Anda Persontidak akan terikat ke dalam kelas Anda yang membuat daftar (yaitu PersonFactory).

Jika Anda melihat tautan di atas, Anda akan melihat bahwa contoh yang serupa dengan milik Anda sebenarnya diposting di bawah bagian nama deskriptif . Namun, untuk alasan di atas saya tidak akan melakukannya dengan cara ini. Lihat bagian Enkapsulasi (juga di tautan).

Mengintip
sumber
1

Saya dapat memberikan contoh dan tidak salah untuk mengembalikan objek bertipe sama dalam tipe yang sama.

Pertimbangkan ini.

class Employee {}

class Manager : Employee 
{
    List<Employee> Employees { get; set;}
    Manager ReportsTo { get; set; }
}

Ada garis tipis antara pemisahan atau pencampuran masalah. Jika Anda menemukan diri Anda di sisi lain dari garis itu, Anda dapat menggunakan manajer / penangan / ... jenis objek.

class Organization 
{
    Employee FindEmployeeByName (string name) {}
    Employee FindManagerOf (Employee emp) {}
    List<Employees> TeamOf (Employee manager)
    ...
}
Kaan
sumber