OOP'deki isimlere dayanan fiilleri kullanmanın yasal olup olmadığını merak ediyorum.
Bu mükemmel makaleye rastladım , yine de yaptığı noktaya katılmıyorum.
Sorunu biraz daha açıklamak için makale, örneğin bir FileWriter
sınıf olmaması gerektiğini , ancak yazmanın bir eylem olduğu için sınıfın bir yöntemi olması gerektiğini belirtir File
. Bir Java programcısı, bir Java programcısının kullanmayacağı bir Ruby programcısı muhtemelen bir FileWriter
sınıfın kullanımına (Ruby File.open
bir dosyaya erişmek için yöntem kullanır) olacağından, genellikle dile bağlı olduğunu fark edeceksiniz .
Benim kişisel (ve evet, çok mütevazi) görüşüm, böyle yapmanın Tek Sorumluluk ilkesini bozacağı yönünde. PHP'de programlandığımda (PHP açıkça OOP için en iyi dil olduğu için değil mi?), Bu tür bir çerçeve kullanırdım:
<?php
// This is just an example that I just made on the fly, may contain errors
class User extends Record {
protected $name;
public function __construct($name) {
$this->name = $name;
}
}
class UserDataHandler extends DataHandler /* knows the pdo object */ {
public function find($id) {
$query = $this->db->prepare('SELECT ' . $this->getFields . ' FROM users WHERE id = :id');
$query->bindParam(':id', $id, PDO::PARAM_INT);
$query->setFetchMode( PDO::FETCH_CLASS, 'user');
$query->execute();
return $query->fetch( PDO::FETCH_CLASS );
}
}
?>
Anladığım kadarıyla DataHandler sonekinin alakalı bir şey eklemediğini ; Fakat mesele şu ki, tek sorumluluk prensibi bize veri içeren bir model olarak kullanılan bir nesnenin (bir Kayıt olarak adlandırılabilir) SQL sorguları ve DataBase erişimi yapma sorumluluğuna sahip olmaması gerektiğini belirtiyor. Bu, bir şekilde, örneğin Ruby on Rails tarafından kullanılan ActionRecord modelini geçersiz kılar.
Geçen gün bu C # koduna (yay, bu yazıda kullanılan dördüncü nesne dili) rastladım:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Ve şunu söylemeliyim ki, bir Encoding
veya Charset
sınıfın gerçekte dizeleri kodlamasının bir anlamı yoktur . Sadece bir kodlamanın gerçekte ne olduğunun bir temsili olmalıdır.
Böylece, şunu düşünme eğiliminde olurdum:
File
Dosyaları açmak, okumak veya kaydetmek bir sınıf sorumluluk değildir .- Kendini
Xml
serileştirmek sınıf sorumluluğu değildir . User
Veritabanını sorgulamak sınıf sorumluluğu değildir .- vb.
Ancak, bu fikirleri ileri sürdüğümüzde, neden Object
bir toString
sınıf olsun? Kendini bir dizgeye dönüştürmek bir Araba ya da Köpeğin sorumluluğu değil, değil mi?
Pragmatik bir bakış açısıyla, toString
katı bir SOLID formunu izlemenin güzelliği için yöntemden kurtulmanın, kodun işe yaramaz hale getirilmesiyle daha sürdürülebilir olmasını sağlayan bir seçenek olmadığını kabul ediyorum.
Ayrıca, bunun için kesin bir cevap ( ciddi bir cevaptan ziyade bir deneme olacaktır ) veya görüşe dayalı olabileceğini de anlıyorum. Yine de yaklaşımımın aslında tek sorumluluk ilkesinin gerçekte ne olduğunu takip edip etmediğini bilmek istiyorum.
Bir sınıfın sorumluluğu nedir?