Stosunkowo niewielkie pytanie, ale nie udało mi się znaleźć oficjalnej dokumentacji ani nawet opinii na blogu / dyskusji na jej temat.
Mówiąc wprost: kiedy mam prywatny obiekt, którego jedynym celem jest służenie prywatnemu lock
, jak mam nazwać ten obiekt?
class MyClass
{
private object LockingObject = new object();
void DoSomething()
{
lock(LockingObject)
{
//do something
}
}
}
Co powinniśmy LockingObject
tu wymienić ? Weź również pod uwagę nie tylko nazwę zmiennej, ale także jej wygląd w kodzie podczas blokowania.
Widziałem różne przykłady, ale pozornie nie ma solidnej porady:
Wiele zastosowań
SyncRoot
(i odmian, takich jak_syncRoot
).- Przykładowy kod:
lock(SyncRoot)
,lock(_syncRoot)
- Wydaje się, że na to ma wpływ równoważne
SyncLock
oświadczenie VB ,SyncRoot
właściwość istniejąca w niektórych klasach ICollection i część pewnego rodzaju wzorca projektowego SyncRoot (co jest prawdopodobnie złym pomysłem) - Będąc w kontekście C #, nie jestem pewien, czy chciałbym mieć nazwę VBish. Co gorsza, w języku VB nazwa zmiennej jest taka sama jak słowa kluczowego. Nie jestem pewien, czy byłoby to źródłem zamieszania, czy nie.
- Przykładowy kod:
thisLock
ilockThis
od artykułów MSDN: C # Blokada komunikat , komunikat VB SyncLock- Przykładowy kod:
lock(thisLock)
,lock(lockThis)
- Nie jestem pewien, czy zostały one nazwane minimalnie wyłącznie dla przykładu, czy nie
- To trochę dziwne, jeśli używamy tego w ciągu
static
klasie / metodzie. - EDYCJA: Artykuł Wikipedii na temat zamków również używa tego nazewnictwa na swój przykład
- Przykładowy kod:
Kilka zastosowań
PadLock
(o różnej obudowie)- Przykładowy kod:
lock(PadLock)
,lock(padlock)
- Nieźle, ale moją jedyną wołowiną jest to, że nic dziwnego, że przywołuje obraz fizycznej „kłódki”, której nie kojarzę z abstrakcyjną koncepcją wątków .
- Przykładowy kod:
Nazywanie blokady na podstawie tego, co zamierza zablokować
- Przykładowy kod:
lock(messagesLock)
,lock(DictionaryLock)
,lock(commandQueueLock)
- Na przykład strona VB SyncRoot MSDN, ma
simpleMessageList
przykład z prywatnymmessagesLock
obiekcie - Nie sądzę, że dobrym pomysłem jest nazwać blokadę typem, który blokujesz („DictionaryLock”), ponieważ jest to szczegół implementacji, który może się zmienić. Wolę nazewnictwo wokół koncepcji / obiektu, który blokujesz („messagesLock” lub „commandQueueLock”)
- Co ciekawe, bardzo rzadko widzę tę konwencję nazewnictwa do blokowania obiektów w próbkach kodu online lub na StackOverflow.
- Przykładowy kod:
(EDYCJA) Specyfikacja C # w sekcji „8.12 Instrukcja blokady” zawiera przykład tego wzorca i nazywa go
synchronizationObject
- Przykładowy kod:
lock(SynchronizationObject)
,lock(synchronizationObject)
- Przykładowy kod:
Pytanie: Jakie jest Twoje ogólne zdanie na temat nazewnictwa prywatnych obiektów blokujących?
Ostatnio zacząłem nazywać je ThreadLock
(tak jakby opcja 3), ale zaczynam kwestionować tę nazwę.
Często używam tego wzoru blokowania (w powyższym przykładzie kodu) we wszystkich aplikacjach, więc pomyślałem, że sensowniej byłoby uzyskać bardziej profesjonalną opinię / dyskusję na temat solidnej konwencji nazewnictwa dla nich. Dzięki!
źródło
SynchronizationContext
jest to coś zupełnie innego.Zwykle nazywam to
locker
, ale ponieważ jest prywatny, uważam, że jest to nieco nieistotny szczegół implementacji. Pierwsza zasada: używaj standardów swojego zespołu / firmy. Jeśli nie ma, cóż, proszę, zrób jeden i użyj go, ale czyniąc to, zachowaj prostotę. Jeśli twoja klasa ma pojedynczy obiekt blokujący, wywołanie gofoo
jest wystarczająco dobre. Jeśli masz ich wiele, dobrym porządkiem biznesu może być po prostu przegląd projektu tej klasy, aby sprawdzić, czy robi zbyt wiele różnych rzeczy. Ale jeśli nie, nazwa staje się ważna, jak w tym całkowicie wymyślonym przykładzie:źródło
Zawsze używałem lck_. W ten sposób, jeśli ctrl + f 'lck', powinieneś tylko znaleźć zamki, podczas gdy „lock” również znajdzie takie rzeczy jak „clock”.
Takie rzeczy, jak lockThis i Padlock są odpowiednie dla portfeli uni, ale do odpowiednich projektów powinieneś naprawdę używać nazw semantycznych, aby patrząc na deklaracje, wiedziałeś, co faktycznie robi obiekt bez przeszukiwania kodu.
źródło