Performanstaki değişiklikler Liskov İkame İlkesini ihlal ediyor mu?


14

Diyelim ki:

interface Thing
{
    GetThing();
}

class FastThing : Thing 
{
    public int GetThing()
    {
        return 1;
    }
}

class SlowThing : Thing
{
    public int GetThing()
    {
        return GetThingFromDatabase();
    }
}

Bu Liskov İkame İlkesinin ihlali midir?


GetThingFromDatabase()bunu tartışmalı kılacak kadar yavaş değil. Factor4096BitPublicKey();return 1;işleri biraz daha ilginç hale getirir.
Patrick


1
Eğer değiştirirseniz FastThingile SlowThing, LSP geçerli değildir. Thing::GetThing"Çok hızlı" yazan bir yorum eklerseniz soru tartışılabilir.
Kafadanbacaklı

Yanıtlar:


14

Bu gerçekten bağlıdır. Bazı arayüzler, örneğin karmaşıklık kısıtlamalarına sahiptir (bunlar açıkça programlı olarak uygulanamaz). En temel durum "GetThing () bir int- yani durur" verir, bu durumda cevap "Hayır" olur - GetThing () 'in her iki sürümü de durur ve bir int döndürür.

Ancak birçok arayüz, karmaşıklık veya düz zamanda performans garantilerini ima etti veya açıkça belirtti. Örneğin, C ++ Standardında, Standard'ın açıkça izin verdiği durumlar dışında kitaplığı engelleme çağrısı ile uygulamak yasa dışıdır.


3
Performans, tip kontrolü ile uygulanabilecek bir şey değildir. Uygulayıcı / kütüphane sorumlusunun vaadidir.
dietbuddha

3
Cevabımda açıkça belirtmiş miydim?
DeadMG

1
Demek istediğim, kritere yazımdan başka bir şey eklediğinizde, Liskov hakkında yazmaya özgü olduğu için artık konuşmuyorsunuz. Farklı performans gösteren nesnelere boyun eğmemenin "uygulaması" iyi olsa da, Liskov'un kendisi hakkında söyleyecek bir şeyi yoktur.
dietbuddha

7
Liskov, Türetilmiş için bir Üs'ün olduğu her yerde kullanılabilir olması gerektiğini belirtiyor. Eğer Baz belirli performansları veya özellikleri garanti ediyorsa bu doğru olmayabilir. Örneğin, Türetilmiş bloklar varsa, kilitlenme potansiyeli olabilir.
DeadMG

8

TL; DR: Hayır

Göre "değişkenleri ve kısıtları kullanarak Davranış alt türlerinin" (prensipte kayıtlılığın) öncelikle bir tür nesneler arasında "güvenli" özellikleri ile ilgilidir. İkame edilebilirliği sadece tip bilgisi bağlamında yöneten özellikler. Bir nesne türü, performansıyla dikeydir. Bu nedenle performanstaki bir fark, Liskov İkame İlkesinin ihlali değildir.


3
Bu makaleye sadece kısa bir göz attım, ancak zamanlama kısıtlamalarının resmi olarak kanıtlanamayacağından emin misiniz? Ve Liskov, zamanlama kısıtlamaları dahil olmak üzere kelimelerde, gerçek dünya programlama ile ilgili olabilecek klasik LSP'nin iyi bir uzantısı olarak görülebileceği anlamına gelmeseydi.
Doc Brown

@Doc Brown: zamanlamanın bir nesneyi değiştirmek için yararlı olup olmadığı Liskov ile dikeydir. Bir sperate kuralı olarak eklemek için, ancak Liskov'un bir parçası olamaz ve olmayacaktır. Boolean mantık denklemine sahip olmak ve şunu söylemek gibidir! Yanlış, ancak yeterince hızlıysa True ile değiştirilebilir. Hızın matematik veya mantıkla hiçbir ilgisi yoktur.
dietbuddha

Karşı örnek: bu kod Java'nın EDT'sinde veya Düğümün olay döngüsünde çağrılır. Yavaş sürümün radikal olarak yavaş performansı yazılımı yarı yarıya keser. Bence bu sorunun doğru cevabı "muhtemelen değil ama istisnalar var".
user949300

6

Arayüz hangi garantileri veriyor? Yana GetThingmarkaların hiçbir garanti ardından alt tipleri saygı gerekmez.

Arayüz benzer bir şeyse GetThingInLinearTimeveya taban türü sanal ise ve varsayılan uygulama bir karmaşıklıksa, bu algoritmik karmaşıklığı daha da kötüleştirmek LSP'yi ihlal eder.


4

Yazılımın performansının Liskov İkame Prensibi ile ilgisi yoktur.

İlke, alt tiplerin ikamesi ve bu nesneyi sadece OOP terimleriyle ikame etmenin davranışsal etkisi ile ilgilidir.

Her getThing()iki durumda da giriş ve çıkış aynı kalır ve hem yavaş hem de hızlı bir şekilde nesneleri aynı duruma getirir.


1

Liskov İkame Prensibi'nin kendisinin özellikle söylediği önemli mi? Bir alt tip, üst tipin tüketicisinin beklentilerini ihlal ederse, LSP'nin daha kısıtlayıcı olup olmadığına bakılmaksızın kötü bir şey gibi görünüyor.

Benim görüşüme göre, bir soyutlama tüketicisinin tüm makul beklentilerinin alt tip tarafından yerine getirilip getirilmediği LSP'nin iyi bir genellemesi gibi görünmektedir.

Bununla birlikte, genel olarak Java arayüzleri yayınladığınız örnekte, Thingarayüz tüketicisinin hızlı mı yoksa yavaş mı olacağı konusunda makul bir beklentisi olduğu açık değildir . Arayüzün javadokları, hangi işlemlerin hızlı olacağına dair söz verilecek dili içerecekse, performans gerekçesiyle bir sorun için bir argüman olabilir. Ancak Java sözleşmesi kesinlikle çeşitli uygulamaların farklı performans özelliklerine sahip olması içindir.


2
anlayabildiğim kadarıyla, yayınlanan örnek Java değil
gnat

0

Bob Amca, LSP ihlalinin 3 taraf gerektirdiğini belirttiği çok benzer bir soruyu yanıtladı:

T'yi kullanan, ancak T'yi kullanan ancak S'nin bir örneği verilen T Tipi, S Tipi ve P programı.

Bu soru, söz etmediğini o, cevap olarak benzer bir yapıya sahip olduğunu bir tahmin yürütebilir P kullanıyor T ve hangi davranış P beklediği.

Cevabını burada bulabilirsiniz . (Bazılarını aşağı kaydırmanız ve Robert Martin adlı kullanıcıdan yanıt aramanız gerekir)


1
bu sorulan soruya nasıl cevap veriyor?
gnat

@gnat Çünkü soru, sorulduğu gibi, eksik. Bir LSP ihlali belirlemek 3 taraf gerektirir. Bunlardan sadece 2 tanesini tedarik etti.
TMc
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.