Skip to content

Instantly share code, notes, and snippets.

View siy's full-sized avatar

Sergiy Yevtushenko siy

  • RDX Works
  • Krakow, Poland
View GitHub Profile
@siy
siy / FluentBuilderExample
Created January 30, 2024 11:39
Java implementation of fluent builder
// Record to build
public record NameAge(String firstName, String lastName, Option<String> middleName, int age) {
static NameAgeBuilderStage1 builder() {
return firstName -> lastName -> middleName -> age -> new NameAge(firstName, lastName, middleName, age);
}
interface NameAgeBuilderStage1 { NameAgeBuilderStage2 firstName(String firstName); }
interface NameAgeBuilderStage2 { NameAgeBuilderStage3 lastName(String lastName); }
interface NameAgeBuilderStage3 { NameAgeBuilderStage4 middleName(Option<String> middleName); }
@siy
siy / SimpleCallFPAsync.java
Last active May 30, 2023 14:32
async version
public Promise<Comment.Id> addComment(Option<User.Id> userId, Option<Publication.Id> publicationId, Option<String> commentText) {
return
validateAndLoad(userId, publicationId, commentText)
.map(this::makeComment)
.flatMap(commentService::addComment);
}
private Comment makeComment(User user, Publication publication, String comment) {
return Comment.newComment(user.id(), publication.id(), comment);
}
@siy
siy / SimpleCallFP.java
Last active May 30, 2023 14:31
refactored functional version
public Result<Comment.Id> addComment(Option<User.Id> userId, Option<Publication.Id> publicationId, Option<String> commentText) {
return
validateAndLoad(userId, publicationId, commentText)
.map(SimpleCallFPRefactored::makeComment)
.flatMap(commentService::addComment);
}
private static Comment makeComment(User user, Publication publication, String comment) {
return Comment.newComment(user.id(), publication.id(), comment);
}
@siy
siy / SimpleCallFP.java
Last active May 30, 2023 14:30
functional version of function example
public Result<Comment.Id> addComment(Option<User.Id> userId, Option<Publication.Id> publicationId, Option<String> commentText) {
return
all(
userId.toResult(Errors.UNKNOWN_USER).flatMap(userService::find),
publicationId.toResult(Errors.UNKNOWN_PUBLICATION).flatMap(publicationService::find),
commentText.toResult(Errors.INVALID_COMMENT)
).map((user, publication, comment) -> Comment.newComment(user.id(), publication.id(), comment))
.flatMap(commentService::addComment);
}
@siy
siy / ContinuousConsolidation.java
Created May 30, 2023 09:14
continuous consolidation
...
var value1 = service1.find(...);
...
var value2 = service2.find(value1.field1());
...
var value3 = service3.find(value2.field2());
...
@siy
siy / LeakingAbstractions.java
Last active May 30, 2023 09:07
leaking abstractions
...
var comment = commentService.find(commentId);
var commentStats = commentStatsService.find(comment.statsId());
...
@siy
siy / SimpleCall.java
Last active May 30, 2023 14:30
refactored function example
public Comment.Id addComment(User.Id userId, Publication.Id publicationId, String commentText) {
validateAddCommentParameters(userId, publicationId, commentText);
return commentService.addComment(makeComment(userId, publicationId, commentText));
}
private static Comment makeComment(User.Id userId, Publication.Id publicationId, String commentText) {
return Comment.newComment(userId, publicationId, commentText);
}
@siy
siy / SimpleCall.java
Last active May 30, 2023 14:29
function example
public Comment.Id addComment(User.Id userId, Publication.Id publicationId, String commentText) {
if (userId == null || userService.find(userId) == null) {
throw new UnknownUserException();
}
if (publicationId == null || publicationService.find(publicationId) == null) {
throw new UnknownPublicationException();
}
if (commentText == null) {
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@Singleton
public class FeatureModelsType {
public static final int FEATURE_ANY_OPTION_INDEX = 0;
private final Context context;
operation1(args...)
.flatMap(value1 -> operation2(args...))
.flatMap(value2 -> operation3(args...))
...
.flatMap(valueN-1 -> operationN(args...));