Z ciekawością czytam bloga Nicka Hodgesa na Why You Should Be Using Interfaces , a ponieważ jestem już zakochany w interfejsach na wyższym poziomie w moim kodowaniu, postanowiłem przyjrzeć się, jak mogę rozszerzyć to na całkiem niskie poziomy i zbadanie, jakie wsparcie dla tego istnieje w klasach VCL.Kodowanie do interfejsu TStrings i TStringList
Częstym konstrukt, że muszę to zrobić coś prostego z TStringList, na przykład ten kod załadować małą listę plików tekst w ciągu tekstowym przecinek:
var
MyList : TStrings;
sCommaText : string;
begin
MyList := TStringList.Create;
try
MyList.LoadFromFile('c:\temp\somefile.txt');
sCommaText := MyList.CommaText;
// ... do something with sCommaText.....
finally
MyList.Free;
end;
end;
Wydaje się piękny uproszczenia, jeżeli mógłbym napisać z użyciem MyList jako interfejs - byłoby pozbyć się try-finally i poprawy czytelności:
var
MyList : IStrings;
//^^^^^^^
sCommaText : string;
begin
MyList := TStringList.Create;
MyList.LoadFromFile('c:\temp\somefile.txt');
sCommaText := MyList.CommaText;
// ... do something with sCommaText.....
end;
nie mogę zobaczyć IStrings zdefiniowane choć - na pewno nie w Classes.pas, chociaż istnieją odniesienia do niego w związku z programowaniem OLE online. Czy to istnieje? Czy to jest ważne uproszczenie? Używam Delphi XE2.
Jeśli chcesz mojej opinii: nie rób tego! Podobnie jak nigdy nie używanie interfejsów nie jest rozwiązaniem, używanie interfejsów do wszystkiego nie jest jednym z nich. Nawet Nick twierdzi, że sprytnie TStrings/TStringList jest perfekcyjnie wykorzystywany jako instancja klasy w swoim najnowszym wpisie na blogu. –
TStrings jest "prawie" interfejsem, jest klasą abstrakcyjną, która może mieć różne implementacje. Kiedy tylko jest to możliwe, przechodzę tylko wokół TStrings jako typ dla parametrów, zamiast TStringList. – mjn
Zgadzam się z @UweRaabe. Interfejsy są potężne, a potężne narzędzia są często nadużywane przez początkujących. Nie używaj odwołania do interfejsu zamiast odwołania do obiektu tylko dlatego, że jest to możliwe. Zalecam stosowanie się do pierwotnego celu interfejsów - otwartego, rozszerzalnego projektu. – kludg