Sadece üzerinde bir yöntem çağırmak için sık sık bir nesne oluşturuyorsanız bir kod kokusu mu


14

Ben böyle bir şey gider kod çok olduğu bir kod tabanı miras:

SomeDataAdapter sda = new SomeDataAdapter();
sda.UpdateData(DataTable updateData);

Ve sonra sda bir daha asla kullanılmaz.

Bu yöntemlerin aslında statik sınıf yöntemleri olması gerektiğini gösteren bir kod kokusu mu?


Bu sınıflar herhangi bir arabirim uyguluyor mu?
Reactgular

7
Statik yöntemlere yeniden baktıktan sonraki gün, veri bağdaştırıcınızın alaycı bir sürümüyle birim testleri çalıştırmak istediğiniz gün olacaktır.
Mike

22
@Mike: Neden statik bir yöntemle alay etmelisiniz? Statik yöntemlerin test edilemediğine dair bu yanlış iddiadan çok yoruluyorum. Statik yöntemler durumunu tutan veya yan etkileri oluşturuyorsanız, yani senin hatan, sizin test metodolojisinin değil hatası.
Robert Harvey

9
Bence bu , "her şey bir sınıf olmalı" analizinin zayıflığını gösteren bir dil kokusudur.
Ben

7
@RobertHarvey: diğer herhangi bir yöntemi alayla aynı nedenle statik bir yöntemle alay etmeniz gerekebilir: birim testi sırasında aramak çok pahalıdır.
kevin cline

Yanıtlar:


1

UpdateData muhtemelen bir 'service' sınıfına ait olması gereken bir mimari kokusu olduğunu düşünürdüm.

Verilerin bir elma olduğu yerler. AppleAdapter hizmet / iş zekası sınıfıdır. AppleService, geçerli yöntemin dışında bulunan bir AppleAdapter için bir Singleton başvurusudur.

private static volatile AppleAdapter _appleService = null;
private static object _appleServiceLock = new object();
private AppleAdapter AppleService
{
    get
    {
        if (_appleService == null)
        {
            lock (_appleServiceLock)
            {
                if (_appleService == null)
                    _appleService = new AppleAdapter();
            }
        }
        return _appleService;
    }
}

public SomeAppleRelatedMethod(Apple apple)
{
    AppleService.UpdateData(apple);
}

Yaptığınız şeyin mutlaka yanlış olduğunu düşünmüyorum, ancak SomeDataAdapter gerçekten bir tür vatansız iş hizmetini temsil ediyorsa, o zaman bir singleton bunun için en iyi yöntem olacaktır. Umarım yardımcı olur! Sağlanan örnek, hem boş hem de tam olarak aynı anda iki veya daha fazla iş parçacığına erişilirse, _appleService ile ilgili hiçbir tartışmayı sağlamanın süslü bir yoludur.

Biliyor musun? SomeDataAdapter bir ADO IDbDataAdapter (ki neredeyse kesinlikle), tüm bu yanıt dikkate almayın!

: P

Orijinal soruya yorum ekleme iznim yok, ancak bu kodun bulunduğu yeri belirtebiliyorsanız.

Bu kod özel bir IDbDataAdapter uygulamasını temsil ediyorsa ve UpdateData bir IDbConnection, IDbCommand oluşturuyor ve hepsini sahnelerin arkasına bağlıyorsa, o zaman hayır bir kod kokusu olarak düşünmüyorum çünkü şimdi akışlar ve diğer bunları kullanmayı bitirdiğimizde bertaraf edilmesi gereken şeyler.


12
Yardım! Yazılım kalıplarında boğuluyorum.
Robert Harvey

4
... ya da bağımlılık olarak enjekte edilir. ;)
Rob

12
Basit bir işleve / prosedüre eşdeğer bir şey elde etmek için tektonlarla uğraşmak ve çift kontrollü kilitleme bana çok daha büyük bir kod kokusu!
Ben

3

Bence bu problem bundan daha derine iniyor. Statik bir yönteme refactor yapsanız bile, o zaman her yerde tek bir statik yöntem çağırdığınız kodu alırsınız. Bence kendi içinde kod kokusu. Bazı önemli soyutlamaları kaçırdığınızı gösterebilir. Belki aralarında neler olduğunu değiştirmenize izin verirken, bazı ön ve son işlemler yapacak bir kod oluşturmak istersiniz. Bu ön ve son işlem, ortak çağrıları içerecekken, aradaki somut uygulamaya bağlı olacaktır.


Çok daha derin bir sorun olduğunu kabul ediyorum. Tam bir mimari yeniden tasarım yapmadan aşamalı olarak geliştirmeye çalışıyorum, ancak düşündüğüm şeyin bunu yapmanın iyi bir yolu olmadığı anlaşılıyor.
Shane Wealti

1

Türü. Bu genellikle bir işlevi iletmek istediğiniz anlamına gelir ve seçtiğiniz dil size izin vermez. Bu biraz beceriksiz ve beceriksiz, ancak birinci sınıf işlevleri olmayan bir dilde sıkışırsanız, yapabileceğiniz çok şey yoktur.

Bu nesnelerin hiçbiri diğer işlevlere argüman olarak geçirilmezse, bunları statik yöntemlere dönüştürebilirsiniz ve hiçbir şey değişmez.


Ayrıca, statik yöntemin kendisine ilettiğiniz bir nesnenin değiştirilmiş bir sürümünü (veya değiştirilmiş bir kopyasını) döndürmesini istediğiniz anlamına da gelebilir.
Robert Harvey

2
"birinci sınıf işlevleri olmayan bir dilde sıkıştıysanız": Yalnızca bir yöntemle birinci sınıf işlev (veya birinci sınıf kapatma) içeren bir nesne arasında fark yoktur: Bunlar, yalnızca iki farklı görünümdür şey.
Giorgio

4
@ Giorgio Teorik olarak hayır. Pratikte, dilinizde en azından bir sözdizimi şekeri yoksa, kendinizi birkaç kodlanmış ve dar kullanışlı işlevler arasındaki fn x => x + 1ve / new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }};veya sınırlayan farktır .
Doval

Neden fn x => x + 1sözdizimsel şeker olamazdı new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }}? Tamam, belki böyle bir sözdizimsel şekeri olmayan bir dilde sıkışıp kaldığınızı kastediyorsanız
Giorgio

@Giorgio Oracle'a sormanız gerekecek. (Verilmiş, nihayet Java 8 ile değişiyor). Gerçekten yararlı olmaktan çok daha fazla sözdizimi şekerine ihtiyacınız olduğunu unutmayın - ayrıca önceden beyan edilmiş yöntemleri ada göre geçirmek isteyebilirsiniz. Körelemek de kullanışlı olacaktır. Bir noktada, işlevlere ilk vatandaş olarak davranmak yerine tüm bu saldırılara değip değmeyeceğini merak etmelisiniz. Ama şimdi konu dışına çıkıyorum.
Doval

0

Eğer devleti tutmak belirli bir sınıfı daha faydalı, işlevsel… yeniden kullanılabilir hale getirirse hayır. Herhangi bir nedenle komut tasarım deseni akla geliyor; bu sebep kesinlikle Robert Harvey'nin boğulma arzusu değildir.


0

"Sıklıkla" tanımlayın. Nesneyi ne sıklıkla somutlaştırıyorsunuz? Çok - muhtemelen değil?

Sisteminizde endişelenmeniz gereken daha büyük sorunlar olabilir. Statik hale gelmek, programcıya nesnenin dahili durumunun değişmediği daha açık bir şekilde iletişim kuracaktır - harika.

Durum yine de dağınıksa ve ilk şeyi statik hale getirmek için başka şeyleri statik hale getirmeye başlamanız gerekiyorsa, hangi parçaların statik olması ve hangi parçaların gerekmediğini sormanız gerekir.

Evet bu bir kod kokusu, sadece küçük bir koku.


0

Statik bir yöntem haline getirin ve devam edin. Statik yöntemlerle ilgili yanlış bir şey yoktur. Bir kullanım modeli ortaya çıktığında, deseni soyutlama konusunda endişelenebilirsiniz.


0

Buradaki koku, bunun nesnelere sarılmış (minimum) prosedürel kod olmasıdır.

Bu işlemi veri tablosunda gerçekleştirmek istemeniz için bir neden olmalı , ancak bu işlemi bazı anlambilimi paylaşan (yani ortak bir anlamı olan) diğer ilgili işlemlerle modellemek yerine, yeni bir prosedür içinde yeni bir prosedür başlattı. sınıf ve denir.

İşlevsel bir dilde, işleri böyle yaparsınız;) ancak OO paradigmasında, bu işlemi içeren bazı soyutlamaları modellemek istersiniz . Ardından, bu modeli temizlemek ve bazı anlambilimi koruyan bir dizi ilgili işlem sağlamak için OO tekniklerini kullanırsınız.

Buradaki ana koku, yazarın sınıfları kullanıyor olması, muhtemelen derleyici gerektirdiği için, işlemleri kavramsal bir modelde organize etmeden.

Sorunlu alan yerine programın modellenmesini gördüğünüzde BTW dikkat edin . Tasarımın daha fazla düşünmeden yararlanabileceğinin bir işaretidir. Diğer bir deyişle, sınıfların hepsinin "xAdaptor" ve "xHandler" ve "xUtility" olduğuna dikkat edin ve genellikle bir anemik etki alanı modeline bağlı olun . Bu, aslında uygulamak istedikleri kavramları modellemenin aksine, kodun kolaylık sağlamak için toplandığı anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.