Program Cleaner .NET

0

Witam wszystkich na forum :)
Jestem tutaj nowy, aczkolwiek miałem już trochę do czynienia z programowaniem, jednak cały czas jestem początkujący tak więc myślę, że będę dość często tutaj bywał ;)
Nie znalazłem odpowiadającego tej kategorii działu forum, więc umieściłem go tutaj.
W tym temacie chciałbym przedstawić Wam mój programik do czyszczenia systemu i wyświetlania informacji o systemie/sprzęcie.
Link do pobrania: http://cleanernet.ugu.pl/
Jest to mój pierwszy projekt, któremu poświęciłem dość dużo czasu i mam plany go rozwijać, dlatego jeżeli ktoś z Was ma chęci pobrać go i wyrazić tutaj swoją opinię byłbym bardzo wdzięczny ;)

Pozdrawiam!

2

Wypadałoby podać link do repozytorium z kodem źródłowym jeżeli chcesz by programiści wyrazili o nim zdanie.

0

Za chwilę umieszczę plik projektu ;)

EDIT: Oto i on: http://cleanernet.ugu.pl/Cleaner.NET%20code.zip

4

1.Cóż za finezyjna nazwa metody - Clearminiat, tyle to mówi, tak dosadnie opisuje, co ta metoda robi, że aż nie ma potrzeby zerkania do kodu.
2.Trzymaj się jednej konwencji nazewnictwa, a nie raz Cośtamtakiego, drugi raz CośTamInnego, a potem jeszcze Check_Chrome (dotyczy się to zarówno funkcji jak i kontrolek).
3.Generalnie duuuuuuużo łamania zasady DRY (dziesiątki funkcji robiących praktycznie to samo, tylko że na innych katalogach w ClearFunction.cs).
4.AnalysisSafariHistory, coś tutaj gramatycznie nie pasuje - przeczytaj sobie kilka razy.
5.To aż boli, że w sumie ClearXyz i AnalysisXyz mają tę samą metodę działania z jedną różnicą, że Clear usuwa dane pliki, a Analysis dodaje je do listy. Ale cały ten kod otaczający tę różnicę jest identyczny, czyli to o czym mówiłem w trójeczce.
6./* WYMAGANY DISPATCHER, DO POKAZANIA OKNA DIALOGOWEGO, POWÓD: Okno jest uruchomione z innego wątku (innej klasy) */ cały komentarz od razu wielkimi literami napisz.
7.Poczytaj o https://msdn.microsoft.com/pl-pl/library/zwc8s4fz.aspx (powód: ~2150 w ClearFunction.cs).
8.if (WhatNETVersion.NETVersion() == "Nie znaleziono .NET w wersji 4.5 lub nowszej!") tak jak gdybyś nie mógł zrobić funkcji zwracającej bool :|
9.Twoja statyczna metoda CheckFor45DotVersion jest błędnie zaimplementowana (przypuśćmy, że releaseKey wynosi 40000, co zwróci?).
10.if (true) wykwintny warunek (WhatNETVersion.cs:17).
11.CheckSumDLL (Start.cs:37) - szyk zdania w języku angielskim jest nieco inny.
12.Jaki sens ma w sumie sprawdzanie tej sumy kontrolnej? (get it?)
13.Kobyła zawarta w OSandHWInfo (SystemInfo.cs:37) zmiotła mnie po prostu z nóg.
14.No i miejscami jeszcze tłumisz wyjątki zamiast je logować... czy robić cokolwiek poza ich tłumieniem.

0

Dzięki za konstruktywną krytykę ;)

  1. Co do nazewnictwa, tak wiem trochę głupio to zrobiłem :E Zamierzam to poprawić ;)
  2. Co do funkcji analizowania i czyszczenia to już znalazłem rozwiązanie jak połączyć to w jedną całość, tak aby nie klepać dwóch identycznych funkcji.
  3. Co do tych komentarzy... Hmm pisałem to dawno temu, wtedy nie zamierzałem tego nikomu pokazywać, stąd to niechlujstwo :P
  4. Jeżeli chodzi o metodę
CheckFor45DotVersion

to wydaje mi się, że po prostu zostanie spełniony pierwszy w kolejności warunek ?
5. Sprawdzam sumę kontrolną w celu sprawdzenia, czy plik *.dll, który jest potrzebny do działania aplikacji nie został podmieniony, jeżeli tak to apka może się po prostu wysypać...
6. Co radzisz zrobić z tą kobyłą :E ? (Nie mam pomysłów).

OSandHWInfo (SystemInfo.cs:37)
0
if (CheckCacheSafari.IsChecked == true)
{
   await Task.Run(() => AnalysisSafariCache());
}
if (CheckHistoriaSafari.IsChecked == true)
{
   await Task.Run(() => AnalysisSafariHistory());
}
if (CheckCookiesSafari.IsChecked == true)
{
   await Task.Run(() => AnalysisSafariCookies());
} 

Pomijając tą drabinkę ifów która ciągnie się na ponad 100 linii to po co tutaj robisz await na każdym Task.Run?

0

Myślałem, że tak trzeba to zapisać, jak powinno to wyglądać ?

PS: Wybaczcie takie pytania, ale serio jestem cały czas bardzo początkujący :P

0

Zależy co chcesz zrobić.

W tym momencie wchodzisz do pierwszego ifa, wywołujesz metodę na Tasku, czekasz aż ona się wykona(await zwraca kontrolę do metody wywołującej, więc nie blokujesz wątku), wchodzisz do drugiego ifa, wywołujesz, czekasz, itd.

0

Chodzi mi o to, żeby wątek główny aplikacji nie był zablokowany działaniami wykonywanymi w tych funkcjach (żeby progressbar się ruszał).
A tą "litanię" if'ów da się zastąpić czymś lepszym ?

PS: Proszę o wytykanie mi wszystkich błędów, i nakierowanie mnie na ich rozwiązanie (będę miał co robić w następny weekend ;) )

Dzięki za pomoc i zainteresowanie! :)

0
Zdziwiony napisał(a):
  1. Jeżeli chodzi o metodę
CheckFor45DotVersion

to wydaje mi się, że po prostu zostanie spełniony pierwszy w kolejności warunek ?

Racja, mój błąd, za szybko spojrzałem i w myśli sobie przejechałem po wszystkich ifach.

  1. Sprawdzam sumę kontrolną w celu sprawdzenia, czy plik *.dll, który jest potrzebny do działania aplikacji nie został podmieniony, jeżeli tak to apka może się po prostu wysypać...

No i wtedy po prostu powinna się wysypać.
A co, jak ktoś sobie podmieni na jakąś nowszą wersję, ale zgodną z poprzednią? Albo skompiluje własną wersję? Albo cokolwiek...
Nie bądź nazistą ;)

  1. Co radzisz zrobić z tą kobyłą :E ? (Nie mam pomysłów).
OSandHWInfo (SystemInfo.cs:37)

Sformatować sensownie.

        private void OSandHWInfo()
        {
			string NewLine = Environment.NewLine;
			
            string OSq =
				HWClass.OSInfo() + NewLine +
				"Wersja: " + HWClass.WindowsVersion() + NewLine 
				"Zainstalowana pamięć RAM: " + HWClass.RAMSize() + " MB" + NewLine +
				"Zalogowany użytkownik: " + Environment.UserName + NewLine +
				"Nazwa komputera: " + HWClass.NamePC() + NewLine +
				"Identyfikator produktu: " + HWClass.WindowsKey() + NewLine +
				"Dysk systemu Windows: '" + HWClass.WindowsDirve() + "'" + NewLine +
				"Katalog Windows: " + HWClass.WindowsDirectory() + NewLine +
				"Katalog systemowy: " + HWClass.SystemDirectory() + NewLine +
				"BIOS: " + HWClass.BIOSName() + NewLine +
				"Wersja BIOS: " + HWClass.BIOSVersion();
			
			/* ... */
		}

Ew. wraz z tym wykorzystać String.Format.

0
Patryk27 napisał(a):

No i wtedy po prostu powinna się wysypać.
A co, jak ktoś sobie podmieni na jakąś nowszą wersję, ale zgodną z poprzednią? Albo skompiluje własną wersję? Albo cokolwiek...
Nie bądź nazistą ;)
.

Wtedy zostanie wyświetlony komunikat, że suma się nie zgadza i jeżeli użytkownik chce pomimo to uruchomić program to tak się stanie ;)

Co do tej kobyły trafne spostrzeżenie, niepotrzebnie nawaliłem tam tyle stringów :E
Będę miał sporo roboty z poprawianiem tego kodu...
EDIT: A co z tą litanią if'ów da się coś z tym zrobić żeby było zapisane bardziej "elegancko" ?

0
Patryk27 napisał(a):

Sformatować sensownie.

        private void OSandHWInfo()
        {
			string NewLine = Environment.NewLine;
			
            string OSq =
				HWClass.OSInfo() + NewLine +
				"Wersja: " + HWClass.WindowsVersion() + NewLine 
				"Zainstalowana pamięć RAM: " + HWClass.RAMSize() + " MB" + NewLine +
				"Zalogowany użytkownik: " + Environment.UserName + NewLine +
				"Nazwa komputera: " + HWClass.NamePC() + NewLine +
				"Identyfikator produktu: " + HWClass.WindowsKey() + NewLine +
				"Dysk systemu Windows: '" + HWClass.WindowsDirve() + "'" + NewLine +
				"Katalog Windows: " + HWClass.WindowsDirectory() + NewLine +
				"Katalog systemowy: " + HWClass.SystemDirectory() + NewLine +
				"BIOS: " + HWClass.BIOSName() + NewLine +
				"Wersja BIOS: " + HWClass.BIOSVersion();
			
			/* ... */
		}

Ew. wraz z tym wykorzystać String.Format.

Tu raczej by się StringBuilder przydał. A czymże jest to NewLine?

Zdziwiony napisał(a):

EDIT: A co z tą litanią if'ów da się coś z tym zrobić żeby było zapisane bardziej "elegancko" ?

Ja bym pomyślał o jakimś słowniku łączącym to coś, co ma IsChecked z akcja, która ma zostać wywołana.

1

Witam,

  1. Pomyśl o zastosowaniu MVVM
  2. Trzymaj się jakiejś konwencji przy pisaniu kodu, umieść pliki w jakiejś logicznej strukturze a obrazki przenieś do zasobów
  3. Zamiast uruchamiać programy systemowe staraj się wywoływać funkcje API np zamiast "ipconfig /flushdns" wykonujesz:
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCache")]
static extern UInt32 DnsFlushResolverCache();
  1. Nie każdy ma polskiego Windows-a, pomyśl o tym
  2. Dodanie NLog lub Log4net byłoby bardzo użyteczne
  3. HWInfo.dll - zdradzisz mi po co umieszczasz te 4 funkcje w zewnętrznej bibliotece do tego wywołujesz je z jakimiś dziwnymi argumentami zamiast odpytywanie do WMI robić w głównym programie?
public string RAMSize(string pass)
{
    if (pass == "&*%^pAss^0")
    {
        long num = 0L;
        long num2 = 0L;
        try
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_PhysicalMemory");
            foreach (ManagementObject obj2 in searcher.Get())
            {
                num2 += Convert.ToInt64(obj2["Capacity"]);
            }
            num = num2 / 0x100000L;
            return num.ToString();
        }
        catch
        {
            return "Unknown error";
        }
    }
    return "wrong arguments";
}
  1. Chyba trochę przesadzasz z tym:
//załadowanie własnej biblioteki
HWdll HWClass = new HWdll();

Ten kod chyba robi coś innego, do komentarza bardziej pasuje coś takiego:

Assembly assembly = Assembly.LoadFrom("HWInfo.dll");
Type type = assembly.GetType("HWdll");
object instanceOfMyType = Activator.CreateInstance(type);

Pozdrawiam,

mr-owl

0
  1. Pierwszy raz o tym słyszę, muszę obeznać się w temacie ;)
  2. Jak będę miał trochę więcej wolnego czasu przysiądę się do tego i uporządkuje kod.
  3. Nie wiedziałem, że można zrobić to w taki sposób, dzięki za podpowiedź ;)
  4. Chcę dodać obsługę innych języków do programu, więc pomyślę i nad tym.
  5. O tym też nigdy nie słyszałem. (jeżeli masz czas i chęci możesz mi wyjaśnić o co chodzi :P)
  6. O które miejsce w kodzie Ci chodzi ? Wydawało mi się, że nie używam żadnych argumentów :P (W tej kobyle) I nie są to 4 funkcje, jest ich trochę więcej. A dlaczego tak zrobiłem ? Głównie dla nauki ;) Chciałem sprawdzić jak wygląda wywołanie funkcji z innej biblioteki, i tak już zostawiłem. Poza tym mogę tą bibliotekę wykorzystać w jakimś innym programie.
    Co do tego argumentu, wydawało mi się że usunąłem go jakiś czas temu i nie widzę go w kodzie, gdzie go znalazłeś :E ?

Co do ostatniego - moja mała wtopa :D

Dzięki za odpowiedź ;)

0

Witam,

Reflectorem (https://www.red-gate.com/products/dotnet-development/reflector/) prześwietliłem twoją bibliotekę dołączoną do programu i tam dostałem takie kwiatuszki.

Pozdrawiam,

mr-owl

0
mr-owl napisał(a):

Witam,

Reflectorem (https://www.red-gate.com/products/dotnet-development/reflector/) prześwietliłem twoją bibliotekę dołączoną do programu i tam dostałem takie kwiatuszki.

Pozdrawiam,

mr-owl

To złą wersję przejrzałeś :P
Ta w folderze Debug jest baardzo stara :P

0

Witam ponownie. Ostatnio trochę posiedziałem nad programem i poprawiłem to i owo. Może do ideału nadal wiele brakuje, ale wydaje mi się, że już lepiej ten kod wygląda ;)
Link: http://www.cleanernet.ugu.pl/download.html
Co sądzicie ?

Pozdrawiam ;)

1

Bleh, stronka kiczowata niczym z przełomu XX i XXI, zainteresuj się Bootstrapem czy innymi frameworkami.

Odnośnie kodu:

HWinfo.cs
OSInfo() - czy aby na pewno potrzebujesz tu zmiennej system?
RAMSize() - dlaczego to zwraca ciąg znaków, a nie liczbę?
InstalledDiscs() - dlaczego to zakłada, że separatorem jest znak nowej linii? Powinno zwracać raczej tablicę.
Processor() - czy aby na pewno potrzebujesz tu zmiennej cpuname? I dlaczego domyślna wartość to "null"?
GraphicCardName() - to samo cd. InstalledDiscs, czyli z serii "a co jeśli chciałbym mieć to po przecinku?"
GraphicCardMemory() - dlaczego to nie zwraca inta?
DrivesInfoPL() - obrzydliwie brzydko sformatowana metoda.
No i generalnie znowu wracamy do łamania zasady DRY - nie widzisz, że strasznie często tam się powtarza kod w stylu:

        public string FajneDane()
        {
            string system = "unidentified";
            try
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_FajneDane");

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    return queryObj["FajneDane"].ToString();
                }
            }
            catch (Exception)
            {
                return "Unknown error";
            }
            return system;
        }

Plus lepsza jest nazwa metody GetWindowsDirectory (lub GetWindowsPath) ponad jakieś WindowsDirectory, to samo odnośnie całej reszty - GetCpuCaption ponad CPUCaption, GetCpuL2CacheSize zamiast CPUL2Cache (...).

Idziemy dalej.

Tak w sumie znikąd wziął się katalog MainWindowClass oraz podkatalog code, do którego wrzucone zostały jakieś jeszcze dziwniejsze pliki, na pierwszy rzut oka niepowiązane w żaden sposób z czymkolwiek jest MainWindowClass.

ClearFunction.cs

  • nie czaję zupełnie, dlaczego ten plik rozszerza klasę MainWindow - przecież ClearTemp nie ma nic wspólnego z klasą zarządzającą głównym oknem.
  • na plus, że trochę zmniejszyłeś moje ówczesne palpitacje serca wywoływane patrzeniem na podwójne metody.
  • na minus, że są jakieś dziwne warunki w stylu if (Directory.Exists(Path.GetTempPath()) == true) - tak jak gdyby if (Directory.Exists(Path.GetTempPath())) nie było już wystarczającą kobyłą, podobnie odnośnie tych wszystkich if (result == true), skoro samo if (result) wystarczy.
  • nadal nie zapoznałeś się z blokiem finally, przez co masz w kodzie takie kwiatki jak dodawanie rozmiaru pliku w try i odejmowanie go w catch, gdyby coś po drodze nie wyszło, zamiast po prostu dodawania go w finally, gdy wszystko poszło ok.
  • sizeallfilestemp - taksięniepiszenazwzmiennych. totalBytesProcessed, totalFilesProcessed brzmią ładniej.
  • IsClean? Co to za nazwa parametru? "czy czyste"? Lepiej nazwij go "czy wyczyścić", np.: ...(bool doClean).
  • dlaczego każda metoda ma osobny zestaw sizeallfile...? Mógłbyś z tego zrobić pola klasy (tylko dwa! totalBytesProcessed i totalFilesProcessed, bez rozdrabiania się), opakować w coś ładnego i mieć wycięty powtarzający się kawałek kodu do odświeżania GUI.
  • nadal występuje bardzo dużo DRY. Nie widzisz tego, ile kodu powtarzasz? Gdybyś miał napisać to bez korzystania z Ctrl+C/Ctrl+V to nie byłoby już tak różowo, prawda?
  • mieszasz nazewnictwo, raz jest ClearCacheThumbnails, potem Clearreporterrors - raz jest sizeallfileLD, a następnie z kolei FileTemp.

ClearFirefoxCache() - //can always delete, because ff is closed to dosyć optymistyczne założenie, zwłaszcza że usunięcie pliku to nie jest nic dziejącego się "ot tak" i po drodze całkiem sporo może nawalić, nawet jeśli Firefox jest zamknięty.

Error() - nie stawiaj spacji przed znakami interpunkcyjnymi (Czy chcesz zapisać kod błędu w celu przekazania go do analizy ?)

ContextMenu.cs

  • znowu jakieś przyrównywanie do wartości logicznych zamiast podejścia sensownego - nie pisz if (Check_OS.IsChecked == false), tylko if (!Check_OS.IsChecked)
  • raz jeszcze masa powtórzonego kodu. Pokażę Ci sztuczkę.
    Przed:
private void Explorer_Click(object sender, RoutedEventArgs e)
{
	if (Check_Explorer.IsChecked == false)
	{
		Check_Explorer.IsChecked = true;
		//
		CheckBox_LatestDocuments.IsChecked = true;
		CheckBox_CacheThumbnails.IsChecked = true;
	}
	else
	{
		Check_Explorer.IsChecked = false;
		//
		CheckBox_LatestDocuments.IsChecked = false;
		CheckBox_CacheThumbnails.IsChecked = false;
	}
}

Po:

private void Explorer_Click(object sender, RoutedEventArgs e)
{
	bool isChecked = !Check_Explorer.IsChecked;

	Check_Explorer.IsChecked = isChecked;
	CheckBox_LatestDocuments.IsChecked = isChecked;
	CheckBox_CacheThumbnails.IsChecked = isChecked;
}

InstalledPrograms.cs
WhatInstalled() omujborze, tony powtarzania tego samego w kółko i w kółko, pomyśl jak to skrócić. Pomijając oczywisty fakt, że WhatInstalled to nawet nie jest poprawne angielskie sformułowanie. WhatIsInstalled jak już, a najlepiej DetectApplications. Kolejny raz także rozszerzasz MainWindow - powiedz mi proszę, dlaczego i po co? Przecież to byłoby perfekt na osobną klasę statyczną.

Language.cs
LoadLanguageCore() - oh god why. Gdybyś miał 100000 kontrolek to też wczytywałbyś jedna po jednej, linia po linii? Zapoznaj się z plikami ini bądź xml bądź po bądź bazą SQLite (...), łapiesz schemat? I po zapoznaniu zrób tak, aby ta metoda była niezależna od liczby kontrolek, tak abyś nigdy więcej nie musiał jej zmieniać, lecz bez problemu mógł dodawać i rozszerzać program o następne buttony, menu etc.
WhatLanguage() - nah, nah, klasa odpowiedzialna za język nie powinna być odpowiedzialna za parsowanie konfiguracji. Od tego powinna być osobna klasa z metodą GetLanguageId() (widzisz także różnicę w czytelności nazw?).
ChooseLanguage() - to nie ma nic wspólnego z obsługą języka, wydziel to gdzie indziej.

RunPrograms.cs
ProcessFireFox - FireFox? procesyall? ffrun? Co to w ogóle za nazwy? Poza tym nazwa tej metody nic nie mówi, IsFirefoxLaunched brzmi ładniej i dokładnie opisuje, co ona zwraca. No i ten, ehm, dlaczego zwraca inta, a nie boola?
To samo odnośnie reszty tych metod, i podobnie jak wyżej - w jakim celu to rozszerza klasę MainWindow?

SystemInfo.cs
OSandHWInfo - kolejna wykwintna nazwa metody, formatowanie jeszcze lepsze.
SaveInfoToFile - jeden komentarz po polsku, drugi po angielsku, potem znowu po polsku, czyżby Anglicy wbili nam się do okopu?

Wychodzimy z katalogu, wracamy do głównego.

WhatNETVersion.cs
NETVersion - nazwa metody sugeruje, że zwracasz wersję .NET Frameworka, tymczasem metoda zwraca bool... hm...
CheckFor45DotVersion - jak już bierzesz kod ze StackOverflow to chociaż zalinkuj do niego w komentarzu lub zmień nazwę metody...

MainWindow.xaml.cs
MainWindow - tutaj pojawia się wywołanie jakiegoś magicznego configweryf, którego nie zauważyłem przedtem. Też intrygująca nazwa metody. Wprowadza wręcz taką nutkę erotyki.
A może to mi się już w głowie coś miesza.
Analizuj_Click - god bless his soul, powiedz mi proszę, że widzisz, jak bardzo ta metoda jest upośledzona :P


Hm, no i to by było na tyle. Wyszło tego znacznie więcej, niżbym pomyślał, co jednak powinno Ci dać do zrozumienia, że warto poznać podstawy, zanim zabierzesz się na poważnie za coś "większego". Poprawianie tego kodu nie miałoby najmniejszego sensu - wyrzuć go i zacznij pisać od zera, uwzględniając wszystkie moje powyższe słowa, a wyjdziesz na tym lepiej.

No i powodzenia ;)

Edit: byłoby także miło, gdybyś wykazał się jakąś oryginalnością, a nie kopiował wygląd z CCleanera.
Edit2: plus mail założony w domenie aplikacji jest raczej średnim pomysłem, chyba że jest to bezpośrednio [email protected].
Edit3: plus kompletnie nie rozumiem, w jakim celu na stronie jest przycisk Archiwum aktualności, skoro jest to podstrona aktualnie nie dostępna (btw, nie z przymiotnikami łącznie).

1

Wow, rzeczywiście jest tego sporo. Dzięki za wskazanie błędów ;)
Fakt... Nie ma sensu poprawiać kodu... Trzeba pisać od zera, będzie szybciej...
Nie dałem rady nawet usunąć wszystkiego co po polsku zostało w kodzie zapisane.

Co do odpowiedzi na twoje spostrzeżenia cóż mogę powiedzieć... Masz rację ;) Dlatego pozwolę sobie odpowiedzieć tylko na jedno:

  • nie czaję zupełnie, dlaczego ten plik rozszerza klasę MainWindow - przecież ClearTemp nie ma nic wspólnego z klasą zarządzającą głównym oknem.

Zrobiłem to tak, bo w każdej funkcji czyszczącej wyświetlam, również całkowity rozmiar plików, które zostały usunięty w danej "pozycji", na chwilę pisania nie miałem pojęcia jak dostać się do okna z innej klasy, chociaż teraz mam na to zupełnie inny pomysł... Generalnie rzecz biorąc tak było najprościej, jak widać najprościej znaczy najgorzej :P
Co do reszty twojej wiadomości, przeczytałem i w wolnym czasie wezmę się za jej dokładne przestudiowanie. Dużo tego ;)

A co do wyglądu, spojrzyj na ten programik: http://lh6.ggpht.com/_1XYQfEGGEIw/Sq-U8kbsLDI/AAAAAAAACc0/TYOtViwcFPo/s800/BleachBit-064-Firefox-Fedora11-English.png
Pewnie znajdzie się tego więcej, tak więc kopiowaniem wyglądu CCleanera tego bym nie nazwał, równie dobrze można powiedzieć, że skopiowałem wygląd od tego BleachBit'a, a zobaczyłem go pierwszy raz jakiś czas po zaprojektowaniu "okienka" programu. Po prostu taki układ jest wygodny... Chociaż zapewne można to zrobić jakoś inaczej... Wszystko się da, potrzeba tylko chęci ;)

Cóż mogę jeszcze powiedzieć... Ogólnie dzięki za pomoc, jeżeli będę mieć jakieś problemy będę pytał na bieżąco, żeby nie powtórzyć takiej wtopy, bo co prawda program działa, ale rozwijanie tego kodu - w dodatku przez inną osobę byłoby - lekko mówiąc męczące.

Jeszcze raz dzięki ;)

0

Witam ponownie :)

Przepisałem ten program od zera, oto wynik:
http://cleanernet.ugu.pl/download/Alpha%201.1.0/source/Cleaner%20.NET%20v1.1.0%20sourcecode.zip

Póki co nie ogarnąłem MVVM, i nie mam planów budować tej apki w ten sposób, aczkolwiek postaram się to ogarnąć, tak żeby kolejne projekty pisać już w MVVM ;)
Tak więc... Proszę o uwagi co znowu zrobiłem źle ;P

Z góry dziękuję ;)

2

Weź to chłopie na githuba wrzuć

0

Chcę założyć konto na sourceforge, jak wrzucę tam kod to podlinkuję ;)

EDIT: Obecnie nie wiem czy jest sens wrzucać coś takiego na tego typu serwis. Dlatego proszę o opinię ;)

1

Jest, nie trzeba ściągać wtedy rara z czyimś kodem i nie wiadomo czym w środku, tylko można sobie szybko przejrzeć.

0

Ok postaram się wrzucić na GitHuba, ale to nie dzisiaj... Nigdy nie miałem z tym narzędziem styczności, więc będę musiał ogarnąć ;p

1

https://visualstudio.github.com/
Tu masz plugin do VS, bardzo przyjemny

1

Otworzyłem plik Cleaning.cs i już widzę, że nadal pełno copy-paste.
Każda metoda robi generalnie to samo tylko na innym folderze...

No i Cleaning to zła nazwa na klasę. https://msdn.microsoft.com/en-us/library/4xhs4564(v=vs.71).aspx

0

Hmm, postaram się to jeszcze jakoś skrócić.
A jak z resztą ?

2

no to ja od siebie mogę dodać takie uwagi:

  • masz za dużo bloków jeden w drugim. Przykład: https://github.com/lukaszpl/Cleaner-.NET/blob/master/Cleaner%20.NET/Cleaner%20.NET/Cleaning.cs#L36 Jak masz już 2 bloki zagnieżdżone, to POWAŻNIE się zastanawiaj nad trzecim. Jak masz 5, to jest pewne, że robisz to źle
  • jest dużo powtarzającego się kodu, np Cleaning::ClearTemporaryFiles oraz ::ClearWindowsErrorReporting są do siebie bardzo podobne
  • funkcje robią za dużo i zapewne stąd ta ilość zagnieżdżeń, ja bym jeszcze bardziej to rozbił, a operacje usuwania plików w folderze wyrzuciłbym do oddzielnej klasy
  • w ogóle klasa Cleaning jest za duża! 200-300 linii z komentarzami to powinien być max
0

Dzięki za uwagi ;) Postaram się wszystko poprawić w wolnym czasie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1