Bu iki uygulamanın aynı madalyonun sadece iki yüzü olup olmadığı ya da gerçekten daha iyi olup olmadığı konusunda arkadaşımla biraz tartışıyorum.
Bir parametre alan, bir üyeyi dolduran ve sonra döndüren bir fonksiyonumuz var:
Item predictPrice(Item item)
Aynı nesne üzerinde çalıştığından , öğeyi iade etmenin bir anlamı olmadığına inanıyorum . Aslında, herhangi bir şey, arayanın perspektifinden bakıldığında, yeni bir öğeyi iade etmesini beklediğiniz gibi, konuları karıştırır .
Hiçbir fark yaratmadığını iddia ediyor ve yeni bir Eşya yaratıp geri vermesinin önemi bile olmayacak. Aşağıdaki nedenlerden dolayı kesinlikle katılmıyorum:
Öğeye (veya işaretçiler veya her ne olursa olsun) birden fazla referansınız varsa, yeni bir nesne tahsis eder ve onu döndürmek bu referanslar yanlış olacağından önemli öneme sahiptir.
Bellek tarafından yönetilmeyen dillerde, yeni bir örneği ayıran işlev belleğin sahipliğini iddia eder ve bu nedenle bir noktada çağrılan bir temizleme yöntemi uygulamak zorunda kalırız.
Öbek üzerinde tahsis etmek potansiyel olarak pahalıdır ve bu nedenle çağrılan işlevin bunu yapıp yapmadığı önemlidir.
Bu nedenle, bir nesneyi değiştirip değiştirmediğini veya yeni bir nesne tahsis ettiğini bir yöntem imzasıyla görebilmenin çok önemli olduğuna inanıyorum. Sonuç olarak, işlev yalnızca iletilen nesneyi değiştirdikçe, imza şöyle olmalıdır:
void predictPrice(Item item)
Birlikte çalıştığım dil olan her kod tabanında (kuşkusuz C ve C ++ kod tabanlarında, Java değil), yukarıdaki stile esasen bağlı kaldım ve çok daha deneyimli programcılar tarafından tutuldu. Kod tabanları ve meslektaşlarımın örnek boyutu olarak tüm olası kod tabanları ve meslektaşlarımdan küçük olduğunu ve bu yüzden tecrübemin birinin üstün olup olmadığı konusunda gerçek bir gösterge olmadığını iddia ediyor.
Peki, herhangi bir düşünce?
Item
bir class Item ...
değil typedef ...& Item
, yerel item
zaten bir kopyasıdır