Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

BATERIA

[Java] Generator haseł

Rekomendowane odpowiedzi

Cześć!

Zacząłem uczyć się Javy i w ramach ćwiczeń, postanowiłem wyklepać sobie klasę, która będzie mi generować losowe hasła.

Chciałbym Was prosić abyście na nią zerknęli, powiedzieli mi czy czegoś nie przekombinowałem i ogólnie mam dobre założenia :) Oczywiście wszystko działa, ale dobrze by było wiedzieć, czy tak powinno to wyglądać.

public class PasswordGenerator {

// z ilu znakow ma skladac sie haslo
private int numberOfCharacters;
// ile hasel mam wygenerowac
private int numberOfPasswords;

// czy mam uzyc malych liter
private boolean smallLetters;
// czy mam uzyc wielkich liter
private boolean bigLetters;
// czy mam uzyc cyfr
private boolean numbers;
// czy mam uzyc znakow specjalnych
private boolean specialChars;

//zbior malych liter
private String smallLettersBox = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,y,z,";
//zbior wielkich liter
private String bigLettersBox = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,Z,";
//zbior znakow specjalnych
private String specialCharsBox = "!,@,#,$,%,^,&,*,";
//zbior cyfr
private String numbersBox = "1,2,3,4,5,6,7,8,9,0,";

// tutaj przetrzymuje zbior znakow, z ktorego ma byc generowane haslo
private String box = "";
// dlugosc utworzonego ciagu znakow, z ktorego liter haslo bedzie generowane
private int boxLenght;

// odpalamy
public PasswordGenerator(boolean smallLetters, boolean bigLetters, boolean numbers, boolean specialChars, int numberOfCharacters, int numberOfPasswords) {

	this.numberOfCharacters = numberOfCharacters;
	this.numberOfPasswords = numberOfPasswords;
	this.smallLetters = smallLetters;
	this.bigLetters = bigLetters;
	this.numbers = numbers;
	this.specialChars = specialChars;

	// uruchamiam metode tworzaca ciag znakow
	makeBox();
}

// tworze ciag znakow, z ktorych ma byc generowane haslo i wrzucam to do zmiennej @String box, nic nie zwracam
public void makeBox() {

	if(smallLetters == true) this.box += this.smallLettersBox;
	if(bigLetters == true) this.box += this.bigLettersBox;
	if(numbers == true) this.box += this.numbersBox;
	if(specialChars == true) this.box += this.specialCharsBox;

	// usuwam przecinek na koncu ciagu znakow
	this.box = this.box.substring(0, (this.box.lastIndexOf(",")));
}

// ciag znakow wygenerowany w makeBox() zmieniam w tablice i zwracam
public String[] generateBox() {

	String[] boxArray = this.box.split(",");

	this.boxLenght = boxArray.length;
	return boxArray;
}

// tutaj generuje pojedyncze losowe litery z tablicy ktora zwraca metoda generateBox();, gotowe haslo zwracam w stringu
public String generateLetter() {
	int count = (int) ((this.boxLenght) * Math.random());

	return generateBox()[count];
}

// generuje pojedyczne haslo z losowych liter ktore generuje metoda generateLetter(), zwracam w stringu
public String generatePassword() {

	String password = "";

	for(int i = 0; i < this.numberOfCharacters; i++) {

		password += generateLetter();
	}

	return password;
}


//tutaj generuje docelowa ilosc hasel, jaka zostala podana w konstruktorze i wrzucam je do tablicy ktora zwracam
public String[] generatePasswords() {

	String[] passwords = new String[this.numberOfPasswords];

	for(int i = 0; i < this.numberOfPasswords; i++) {
		passwords[i] = generatePassword();
	}

	return passwords;
}
}

Z góry dzięki za poświęcony czas!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No trochę przekombinowane, nawet bardzo. Javy nie używam ale po kodzie widać od razu plus szybki research na stacku i tam jest rozwiązanie jednolinijkowe :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość

Strasznie tu dużo rzeczy, bez których można się obejść.. aż mi się nie chce wszystkiego opisywać ale powiem o czymś co mnie osobiście razi w oczy. Nazywanie zmiennych, np. taki boxArray - nie dość, że niewiele mówi z punktu widzenia abstrakcyjności problemu, to doklejanie nazw typów do zmiennych nie jest chyba najlepszym pomysłem. Bo zaraz będziemy pisać nameString, surnameString etc..

Warto też przyłożyć się do samego nazewnictwa - w tym wypadku to raczej nie 'numbers' tylko 'digits', nie 'big' tylko 'capital'. A tak w ogóle to nie Lenght tylko length. Niby drobiazgi ale czytając nawet taką prostą klasę widać dużo lepiej co autor miał na myśli. Zwłaszcza jeśli zaczynasz naukę to warto nauczyć się dobrych praktyk.

No i oczywiście pomysłów na taką klasę może być wiele, pewnie co programista to inny, ale można tu sporo odgruzować.. np. po co te przecinki, które i tak potem usuwasz.. albo czy aby na pewno potrzebujesz zmiennej bigLetterBox, czy nie wystarczy toUpperCase.. btw co jeśli nie będzie ani małych ani dużych liter? etc..

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja jeszcze dodam, iż nie widzę sensu w zestawach znaków wstawiać przecinków. Przecież wystarczy trzymać tablice z samymi znakami, po co tracić czas na zabawę z przecinkami.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

po co w ogóle trzymać znaki w tablicach jak wiadomo, że używa tylko ASCII i można wszystko generować w locie

 

całość strasznie przekombinowana ...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

nie dość, że niewiele mówi z punktu widzenia abstrakcyjności problemu, to doklejanie nazw typów do zmiennych nie jest chyba najlepszym pomysłem.

Są konwencje nazewnicze, które wręcz to nakazują. Teoretycznie pomagają uniknąć trudnych w lokalizacji błędów związanych z mieszaniem typów. Osobiście nie jestem ich fanem, zwłaszcza używanych w nowoczesnych IDE podpowiadających typ po najechaniu myszą itp.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość

Są konwencje nazewnicze, które wręcz to nakazują. Teoretycznie pomagają uniknąć trudnych w lokalizacji błędów związanych z mieszaniem typów. Osobiście nie jestem ich fanem, zwłaszcza używanych w nowoczesnych IDE podpowiadających typ po najechaniu myszą itp.

 

Nawet jeśli takie konwencje istnieją to po pierwsze na pewno nie są standardem w przypadku Javy a po drugie uważam, że radzenie sobie z rozpoznawaniem typu przez stosowanie takiego nazewnictwa jest absurdalne (i niebezpieczne).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie rozpędzaj się z ta absurdalnością. Programiści używali np. notacji węgierskiej jeszcze zanim ty czy ja znaleźliśmy się na tym świecie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość

Nie rozpędzaj się z ta absurdalnością. Programiści używali np. notacji węgierskiej jeszcze zanim ty czy ja znaleźliśmy się na tym świecie.

Gdybyś przeczytał dokładnie to co napisałem, to zobaczyłbyś że ja nie neguję, że taka notacja istnieje. Tylko jeżeli uważasz, że rozpoznanie typu warto opierać na nazwie zmiennej.. cóż, wolna wola.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...