2010-03-25 10 views
9

Jedno z pytań I został poproszony, że mam tabeli bazy danych z następującymi kolumnamipotrzeba przemyślenia na mój wywiad pytanie - .NET, C#

pid - unique identifier 
orderid - varchar(20) 
documentid - int 
documentpath - varchar(250) 
currentLocation - varchar(250) 
newlocation - varchar(250) 
status - varchar(15) 

muszę napisać aC# aplikację przenieść pliki z currentlocation do kolumny newlocation i status aktualizacji jako "SUCCESS" lub "FAILURE".

To była moja odpowiedź

  1. utworzyć listę wszystkich rekordów przy użyciu LINQ

  2. Tworzenie obiektu polecenia, które byłoby wykonać przenoszenie plików

  3. użyciu foreach, powołać delegata przenieść pliki -

  4. użyj endinvoke, aby uchwycić wyjątek i zaktualizować db accordin gly

Powiedziano mi, że wzorzec polecenia i delegata nie pasują do rachunku tutaj - zostałem nakłoniony do przemyślenia i wdrożenia korzystniejszego wzoru GoF.

Nie jestem pewien, czego szukał - w dzisiejszych czasach kandydaci mają wiele informacji na głowie, ponieważ zawsze mają Google'a, aby znaleźć odpowiedź i znaleźć rozwiązanie.

+9

Szczerze mówiąc, nie widzę w ogóle, w jaki sposób stosuje się wzorce GoF. To brzmi jak trywialny 20-wierszowy program z kilkoma podprogramami używającymi ORM jak Linq do SQL lub EF i nie więcej niż 50 linii w surowym ADO.NET. – Aaronaught

+2

Jestem z Aaronaught na tym, wydaje się zbyt proste, aby wymagać znaczący wzór GoF. Jeśli dostaniesz trochę więcej informacji, takich jak liczba rekordów, których możesz oczekiwać w bazie danych, być może będziesz w stanie wymyślić dobre decyzje. Polecenie + usuń pomysł było całkiem godnym podziwu rozwiązaniem w stylu wywiadu w tym pytaniu, czy mogę tak powiedzieć ... – LorenVS

+0

Użyłem delegatów, ponieważ nie miałem pojęcia, ile było tam rekordów, a z delegatami mogłem pójść z ogniem i zapomnieć rutyna – uno

Odpowiedz

3

Zgadzam się z powyższym komentarzem Aaronaught. W przypadku takiego problemu czasami można go przemilczeć i spróbować zrobić coś więcej niż trzeba.

To powiedziawszy, jeden wzorzec GoF, który przychodził na myśl, to "Iterator". W swoim pierwszym oświadczeniu powiedziałeś, że chcesz przeczytać wszystkie zapisy na liście. Jedyną rzeczą, która może być problematyczna, jest to, że masz miliony takich rekordów. Prawdopodobnie chciałbyś przetworzyć je w bardziej sukcesywny sposób, zamiast czytać całą listę w pamięci. Wzorzec Iterator daje możliwość iteracji na liście bez konieczności poznania mechanizmu przechowywania/pobierania danych (bazy danych). Podstawowa implementacja iteratora może pobrać jedną, dziesięć lub setkę rekordów na raz, a na żądanie udostępnić je logice biznesowej. Zapewniłoby to również pewną korzyść z testowania, ponieważ można przetestować swoją logikę "biznesową" za pomocą innego rodzaju bazowej pamięci masowej (np. Listy w pamięci), aby testy jednostek były niezależne od bazy danych.

+0

Andy: czy możesz poprowadzić mnie do jakiejkolwiek próbki, która Twoim zdaniem jest warta, co mogłoby wyjaśnić użycie wzoru iteratora, jak sugerujesz? – uno

+0

Nie znam próbki, którą również mogę wskazać, ale prawdopodobnie mógłbyś napisać coś samemu, żeby ją wypróbować. Spójrz na artykuł "Iterator" na Wikipedii, który zawiera kilka prostych przykładów na to, jak zwykle implementowany jest iterator, i możesz go rozszerzyć, aby uzyskać bazowe wyszukiwanie w bazie danych. –

2

Dogłębne zrozumienie wzorców to coś, co powinieneś mieć jako programista - nie powinieneś odwiedzać Google, aby określić, który wzorzec "używać", ponieważ nie masz wystarczająco czasu, aby naprawdę zrozumieć ten wzorzec pomiędzy kiedy zaczniesz czytać o nim i kiedy go zastosujesz.

Wzory dotyczą głównie siły rozumienia i uwięzienia. Oznacza to, że siły tworzą pewne rodzaje zmienności i mamy dobrze zrozumiałe sposoby enkapsulacji tego rodzaju wariacji. "Wzór" to zbiór zrozumienia, które siły prowadzą do tego, jakiego rodzaju warianty i które metody enkapsulacji najlepiej odpowiadają tym.

Mam przyjaciela, który uczył kurs wzorców i nagle uderzyło go, że może rozwiązać dany problem "używając" (czyli "wdrażając technikę enkapsulacji") każdy wzór w swoim podręczniku. Naprawdę świetnie się spisało, pomagając w prowadzeniu domu, że znalezienie odpowiedniej techniki jest ważniejsze niż umiejętność zastosowania techniki.

poleceń wzór, na przykład, zaczyna się od zrozumienia, że ​​czasami chcemy zmieniać gdy coś się dzieje. W takich przypadkach chcemy oddzielić decyzję, co zrobić z decyzją, kiedy to zrobić. W tym przykładzie nie widzę żadnego wskazania, że ​​twoje polecenie powinno być w ogóle zmienione.

W rzeczywistości nie widzę niczego, co by się zmieniło, więc nie było żadnych problemów w ogóle. Jeśli twoi rozmówcy mówili, że są, to mogą również nauczyć się czegoś.

Anywho ... Polecam Opisy wzorców projektowych autorstwa Shalloway and Trott. Dostaniesz głębsze zrozumienie, do czego naprawdę służą wzorce i jak pomagają ci wykonywać swoją pracę, i kiedy następnym razem powiedzą ci, że "wykorzystujesz" niewłaściwy schemat, możesz po prostu być w stanie je kształcić. Wydaje mi się, że wygląda to całkiem dobrze ... w około 20% przypadków. :)

+0

Max: czy twój przyjaciel publikuje swoje slajdy? Znalazłem: http://stackoverflow.com/questions/782690/pattern-books-for-c-vb-net-developers Moja myśl o Google była bardziej związana z funkcjami itp., Jak próba określenia niektóre wyrazy lambda, które ktoś inny mógł już rozwiązać i opublikować na swoim blogu: – uno

+0

To wszystko było na tablicy. Masz rację, że te głupie pytania technologiczne są, cóż, głupie. Mówiłem o wzorcach będących częścią twojego pytania. –

+0

... ale zawsze chętnie omawiam to na bardziej odpowiednim forum. Sprawdź konto Yahoo! LeanProgramming group; byłoby to prawdopodobnie dobre miejsce do dogłębnej dyskusji na temat wzorców. –

0

Powiedziałbym raczej, że ankieter chciał, abyś użył (lub wzmiankował) tutaj zasad projektowania obiektowego zorientowanych obiektowo, iw tym procesie możesz użyć jakiegoś wzoru.

Na przykład, moglibyśmy zaprojektować taki wzór jak poniżej, który będzie zgodny z SRP, OCP i DIP.

internal interface IStatusRecordsToMove 
{  
    List<IRecord> Records { get; } 
} 

internal interface IRecord 
{ 
    string Status { get; set; } 
} 

internal interface IRecordsMover 
{ 
    ITargetDb TargetDb { get; } 
    void Move(IStatusRecordsToMove record); 
} 

internal interface ITargetDb 
{ 
    void SaveAndUpdateStatus(IRecord record); 
} 

class ProcessTableRecordsToMove : IStatusRecordsToMove 
{ 
    public List<IRecord> Records 
    { 
     get { throw new NotImplementedException(); } 
    } 
} 

internal class ProcessRecordsMoverImpl : IRecordsMover 
{ 
    #region IRecordsMover Members 

    public ITargetDb TargetDb 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public void Move(IStatusRecordsToMove recordsToMove) 
    { 
     foreach (IRecord item in recordsToMove.Records) 
     { 
      TargetDb.SaveAndUpdateStatus(item); 
     } 
    } 

    #endregion 
} 

internal class TargetTableBDb : ITargetDb 
{ 
    public void SaveAndUpdateStatus(IRecord record) 
    { 
     try 
     { 
      //some db object, save new record 
      record.Status = "Success"; 
     } 
     catch(ApplicationException) 
     { 
      record.Status = "Failed"; 
     } 
     finally 
     { 
      //Update IRecord Status in Db 
     } 
    } 
}