Imenovanja u Java okruženju: Difference between revisions
10.11.2025 Uroš | 14.11.2025
No edit summary |
No edit summary |
||
| Line 133: | Line 133: | ||
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { } | public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { } | ||
</pre> | </pre> | ||
== Varijable i konstante == | == Varijable i konstante == | ||
Revision as of 11:36, 12 November 2025
Vreme? |
Obavezno dodati kratki opis sadržaja i vreme {{abstract|txt=vaš tekst|min=koliko minuta}} |
Test prve strane
Opšta pravila
- Koristimo engleski jezik – svi nazivi moraju biti na engleskom
- Deskripcija obavezna – naziv treba jasno da opisuje šta klasa/metoda radi
- Izbegavanje skraćenica – osim opštih (ID, DTO, URL, HTTP)
- Izbegavati nepotrebne reči – izbeći dodavanje (myClass, TheClass)
CamelCase Konvencije
- PascalCase (UpperCamelCase) – UserService, AuthenticationController
- camelCase (lowerCamelCase) – userName, calculateTotal
Dužina imenovanja
| Element | Idealno (cilj) | Gornja granica | Napomene |
|---|---|---|---|
| Naziv paketa | 1-3 kratka segmenta | 4-5 segmenata | com.balans.auth.services ✅; izbegavati dublje hijerarhije |
| Klasa/Interfejs | ≤ 20-25 karaktera | ≤ 40-50 | AuthenticationService ✅; CgaBulkOperationService → CgaBulkService |
| Metoda | ≤ 20-30 karaktera | ≤ 50-60 | Glagol + objekat: findByUsername, issueFirmToken |
| Varijabla | ≤ 15-20 karaktera | ≤ 30 | Kratko i jasno: attemptCount, accessibleFirms |
| Konstanta | ≤ 25-30 karaktera | ≤ 40-50 | TOKEN_EXPIRY_DURATION, MAX_LOGIN_ATTEMPTS |
Tretiranje akronima
fghtfng
Klase i interfejsi
fgnfgn
Metode
1. Osnovne konvencije
Format: camelCase (počinje malim slovom)
Stil: glagol ili glagolska fraza
public void login() { }
public User findUserByUsername(String username) { }
public boolean isValid() { }
public List<Firm> getAccessibleFirms() { }
public void Login() { }
public User user(String username) { }
public boolean valid() { }
public List<Firm> firms() { }
2. Standardni prefiksi
Getter metode — get
public String getUsername() { }
public Integer getFirmId() { }
public List<Group> getGroups() { }
public LocalDateTime getCreatedAt() { }
Boolean getteri koriste is/has/can:
public boolean isActive() { }
public boolean isLocked() { }
public boolean hasAccess() { }
public boolean canAccess() { }
public boolean getActive() { }
Setter metode — set
public void setUsername(String username) { }
public void setActive(boolean active) { }
public void setGroupIds(List<Integer> groupIds) { }
Query/Find metode
public User findByUsername(String username) { }
public List<User> findByGroupId(Integer groupId) { }
public Optional<User> findById(Long id) { }
public List<User> findAll() { }
public Page<User> findAllByStatus(Integer status, Pageable pageable) { }
Check/Validation metode
public boolean exists(Long id) { }
public boolean existsByUsername(String username) { }
public void validate(LoginRequest request) { }
public void validatePassword(String password) { }
public boolean isPasswordValid(String password) { }
Create/Save metode
public User create(User user) { }
public User save(User user) { }
public void persist(User user) { }
public User createUser(CreateUserRequest request) { }
Update metode
public User update(User user) { }
public User updateEmail(Long userId, String newEmail) { }
public void updateStatus(Long userId, Integer status) { }
Delete metode
public void delete(Long id) { }
public void deleteById(Long id) { }
public void deactivate(Long id) { }
public void softDelete(Long id) { }
Count metode
public long count() { }
public long countByStatus(Integer status) { }
public int countActiveUsers() { }
Build/Generate metode
public String buildToken(User user) { }
public String generatePassword() { }
public String generateSessionId() { }
public User buildUser(UserData data) {
Convert/Transform metode
public UserResponse toResponse(User user) { }
public User toEntity(UserRequest request) { }
@Override public String toString() { }
public List<Integer> parseGroupIds(String groupIdString) { }
Calculate metode
public BigDecimal calculateTotal() { }
public int calculateAge(LocalDate birthDate) { }
public Duration calculateDuration(LocalDateTime start, LocalDateTime end) { }
Varijable i konstante
1. Lokalne varijable i parametri
Format: camelCase
stil: imenica koja opisuje podatak
Dobro
String username; Integer userId; List<Firm> availableFirms; LocalDateTime createdAt; boolean isActive.
Loše
String Username; String usr; String strUsername; String user_name.
Česte konvencije:
ID varijable
Long userId; Integer firmId; Long accountId.
Kolekcije (uvek množina)
List<User> users; Set<Integer> firmIds; Map<String, User> userMap.
Boolean varijable (pitanje ili stanje)
boolean isActive; boolean hasAccess; boolean canDelete; boolean shouldValidate.
DTO/Request objekti
LoginRequest loginRequest; CreateUserRequest createRequest; BulkUserCreateRequest bulkRequest.
Response objekti
LoginResponse loginResponse; UserResponse userResponse.
2. Instance varijable (fields)
Dobro
public class User {
private Long accId;
private String username;
private String email;
private Integer roleType;
private LocalDateTime createdAt;
private List<Integer> groupIds;
}
Loše
public class User {
private Long AccId;
private String _username;
private String m_email;
private Integer role_type;
}
3. Static final konstante
Format: SCREAMING_SNAKE_CASE
Dobro
public static final int MAX_LOGIN_ATTEMPTS = 5; public static final String DEFAULT_ROLE = "USER"; public static final Duration TOKEN_EXPIRY_DURATION = Duration.ofHours(24); public static final String JWT_ISSUER = "balans";
Loše
public static final int maxLoginAttempts = 5; public static final int max_attempts = 5; public static final String defaultRole = "USER";
Konvencije za konstante
HTTP status
public static final int STATUS_OK = 200; public static final int STATUS_UNAUTHORIZED = 401;
DB status
public static final int STATUS_ACTIVE = 0; public static final int STATUS_INACTIVE = 1; public static final int STATUS_LOCKED = 2;
Role type
public static final int ROLE_USER = 0; public static final int ROLE_CGA = 1; public static final int ROLE_CSA = 2;
Token types
public static final String TOKEN_TYPE_CLUSTER = "CLUSTER"; public static final String TOKEN_TYPE_FIRM = "FIRM";
Error codes
public static final String ERROR_AUTH_INVALID = "AUTH_INVALID"; public static final String ERROR_USER_LOCKED = "USER_LOCKED";
Delimiter konstante
public static final String GROUP_DELIMITER = ","; public static final String FIRM_DELIMITER = ",";
4. Enum konstante
Format: SCREAMING_SNAKE_CASE
public enum TokenType {
CLUSTER,
FIRM,
ARCHIVE
}
public enum UserStatus {
ACTIVE,
INACTIVE,
LOCKED
}
public enum RoleType {
USER,
CGA,
CSA
}
public enum HttpStatus {
OK(200),
UNAUTHORIZED(401),
FORBIDDEN(403);
private final int code;
HttpStatus(int code) { this.code = code; }
public int getCode() { return code; }
}
Paketi
1. Osnovne konvencije
Format: sva mala slova, bez underscore ili camelCase.
Struktura: obrnuti domen + aplikacija + modul.
package com.balans.auth.controllers; package com.balans.auth.services; package com.balans.auth.domain; package com.balans.auth.dto; package com.balans.auth.Controllers; package com.balans.auth.user_service; package com.balans.auth.userService;
poslednja 3 reda su u nedozvoljenom formatu
2. Standardna struktura paketa
Root com.balans.auth
| Paket | Svrha | Tipične klase |
|---|---|---|
| com.balans.auth.controllers | HTTP endpoint-i (REST sloj) | AuthResource, UserResource |
| com.balans.auth.services | Poslovna logika i orkestracija | AuthenticationService, SessionService |
| com.balans.auth.domain | JPA/entiteti i domenski modeli | User, Group, CbaSession |
| com.balans.auth.dto | Ulazno/izlazni DTO objekti | LoginRequest, LoginResponse |
| com.balans.auth.exceptions | Domen-specifični izuzeci | AuthenticationException, UserLockedException |
| com.balans.auth.security | Bezbednosni utili i komponente | PasswordEncoder, JwtService |
| com.balans.auth.repositories | Pristup podacima (repo sloj) | UserRepository, GroupRepository |
| com.balans.auth.config | Konfiguracija modula i bean-ovi | AuthConfig, ObjectMapperConfig |
Primeri
Vidim 'Primeri' u sadržaju, ali ih ne vidim na kraju dokumenta - iza 'Paketi'