-
-
Notifications
You must be signed in to change notification settings - Fork 680
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding approach for Bob #2861
Open
jagdish-15
wants to merge
20
commits into
exercism:main
Choose a base branch
from
jagdish-15:add-approach-bob
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Adding approach for Bob #2861
Changes from 8 commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
a58600a
Adding approach for Bob
jagdish-15 fa97c07
Fixing style errors
jagdish-15 f5f7680
Fixing style errors
jagdish-15 f6ae1f1
Fixing style errors
jagdish-15 4be572f
Adding uuid for new approach of bob exercise
jagdish-15 da71900
Fixing nameing issues
jagdish-15 51a8cd3
Adding snippet.txt
jagdish-15 3ddea06
FIxing formatting of config.josn for approach of bob
jagdish-15 64261e0
Adding approach for Bob
jagdish-15 b644b1c
Fixing style errors
jagdish-15 1dcbe19
Fixing style errors
jagdish-15 f06c782
Fixing style errors
jagdish-15 d0346c1
Adding uuid for new approach of bob exercise
jagdish-15 8f2ac6b
Fixing nameing issues
jagdish-15 0bf84b5
Adding snippet.txt
jagdish-15 e509381
FIxing formatting of config.josn for approach of bob
jagdish-15 f0543c3
Chnaging the introduction.md for consistancy
jagdish-15 e67fc43
Merge branch 'main' into add-approach-bob
jagdish-15 ad27bb2
Chnaging the introduction.md for consistancy
jagdish-15 6def244
Chnaging the introduction.md for fixing styling errors
jagdish-15 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
89 changes: 89 additions & 0 deletions
89
exercises/practice/bob/.approaches/method-based/content.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
# Method-Based Approach | ||
|
||
In this approach, the different conditions for Bob’s responses are separated into dedicated private methods within the `Bob` class. This method-based approach improves readability and modularity by organizing each condition check into its own method, making the main response method easier to understand and maintain. | ||
|
||
The main `hey` method determines Bob’s response by delegating each condition to a helper method (`isSilent`, `isYelling`, and `isAsking`), each encapsulating specific logic. | ||
|
||
## Explanation | ||
|
||
This approach simplifies the main method `hey` by breaking down each response condition into helper methods: | ||
|
||
1. **Trimming the Input**: | ||
The `input` is trimmed using the `String` [`trim()`][trim] method to remove any leading or trailing whitespace. This helps to accurately detect if the input is empty and should prompt a `"Fine. Be that way!"` response. | ||
|
||
2. **Delegating to Helper Methods**: | ||
Each condition is evaluated using the following helper methods: | ||
|
||
- **`isSilent`**: Checks if the trimmed input has no characters. | ||
- **`isYelling`**: Checks if the input is all uppercase and contains at least one alphabetic character, indicating shouting. | ||
- **`isAsking`**: Verifies if the trimmed input ends with a question mark. | ||
|
||
This modular approach keeps each condition encapsulated, enhancing code clarity. | ||
|
||
3. **Order of Checks**: | ||
The order of checks within `hey` is important: | ||
- Silence is evaluated first, as it requires an immediate response. | ||
- Shouted questions take precedence over individual checks for yelling and asking. | ||
- Yelling comes next, requiring its response if not combined with a question. | ||
- Asking (a non-shouted question) is checked afterward. | ||
|
||
This ordering ensures that Bob’s response matches the expected behavior without redundancy. | ||
|
||
## Code structure | ||
|
||
```java | ||
class Bob { | ||
String hey(String input) { | ||
var inputTrimmed = input.trim(); | ||
|
||
if (isSilent(inputTrimmed)) | ||
return "Fine. Be that way!"; | ||
if (isYelling(inputTrimmed) && isAsking(inputTrimmed)) | ||
return "Calm down, I know what I'm doing!"; | ||
if (isYelling(inputTrimmed)) | ||
return "Whoa, chill out!"; | ||
if (isAsking(inputTrimmed)) | ||
return "Sure."; | ||
|
||
return "Whatever."; | ||
} | ||
|
||
private boolean isYelling(String input) { | ||
return input.chars() | ||
.anyMatch(Character::isLetter) && | ||
input.chars() | ||
.filter(Character::isLetter) | ||
.allMatch(Character::isUpperCase); | ||
} | ||
|
||
private boolean isAsking(String input) { | ||
return input.endsWith("?"); | ||
} | ||
|
||
private boolean isSilent(String input) { | ||
return input.length() == 0; | ||
} | ||
} | ||
``` | ||
|
||
## Advantages of the Method-Based Approach | ||
|
||
- **Readability**: Each method is clearly responsible for a specific condition, making the main response logic easy to follow. | ||
- **Maintainability**: Changes to a condition can be confined to its method, minimizing impacts on the rest of the code. | ||
- **Code Reusability**: Helper methods can be reused or adapted easily if new conditions are added in the future. | ||
|
||
## Considerations | ||
|
||
- **Efficiency**: While this approach introduces multiple method calls, it enhances readability significantly, which is often more valuable in non-performance-critical applications. | ||
- **Error Prevention**: This approach avoids redundant code, reducing the risk of maintenance errors. | ||
|
||
## Shortening Condition Checks | ||
|
||
If each `if` statement body is only a single line, braces can be omitted, or the test expression and result could be placed on a single line. However, [Java Coding Conventions][coding-conventions] recommend always using curly braces for error prevention and easier future modifications. | ||
|
||
### Alternative: Inline Helper Methods | ||
|
||
For smaller projects, consider implementing helper methods inline or as lambdas, though this might reduce readability. | ||
|
||
[trim]: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim() | ||
[coding-conventions]: https://www.oracle.com/java/technologies/javase/codeconventions-statements.html#449 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
if (isSilent(inputTrimmed)) | ||
return "Fine. Be that way!"; | ||
if (isYelling(inputTrimmed) && isAsking(inputTrimmed)) | ||
return "Calm down, I know what I'm doing!"; | ||
if (isYelling(inputTrimmed)) | ||
return "Whoa, chill out!"; | ||
if (isAsking(inputTrimmed)) | ||
return "Sure."; |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To be honest, I think this approach is the same as the existing
if-statement
approach. The only difference is that the conditions are in methods instead of variables. Is there something else that differentiates this approach from the other ones?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @kahgoh for your feedback! I understand your point, and while both the method-based approach and the
if
statement approach use condition checks, there are a few key differences that I think set the method-based approach apart:Separation of Concerns:
isYelling()
,isAsking()
,isSilent()
). This makes the mainhey()
method cleaner and focused on handling the flow of responses.if
approach, the logic is directly embedded in the main method, which could become harder to read and maintain as more checks are added.Improved Readability:
if
statements. For example,isYelling()
immediately tells you that it’s checking for shouting behaviour, andisAsking()
clarifies the question check.Maintainability:
Scalability:
In summary, while both approaches work, the method-based approach tends to be cleaner, more modular, and easier to extend. It may seem similar on the surface, but the structure I’ve chosen is designed with maintainability and scalability in mind, which are good practices even for small exercises like this one.
If you have any suggestions or further insights on this approach, I'd be happy to hear them!