Neha123291 opened a new pull request, #657:
URL: https://github.com/apache/commons-text/pull/657

   <!--
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
     regarding copyright ownership.  The ASF licenses this file
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at
   
       http://www.apache.org/licenses/LICENSE-2.0
   
     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
   -->
   
   Thanks for your contribution to [Apache 
Commons](https://commons.apache.org/)! Your help is appreciated!
   
   Before you push a pull request, review this list:
   
   - [ ] Read the [contribution guidelines](CONTRIBUTING.md) for this project.
   - [ ] Run a successful build using the default 
[Maven](https://maven.apache.org/) goal with `mvn`; that's `mvn` on the command 
line by itself.
   - [ ] Write unit tests that match behavioral changes, where the tests fail 
if the changes to the runtime are not applied. This may not always be possible 
but is a best-practice.
   - [ ] Write a pull request description that is detailed enough to understand 
what the pull request does, how, and why.
   - [ ] Each commit in the pull request should have a meaningful subject line 
and body. Note that commits might be squashed by a maintainer on merge.
   
   Commit 1-  [Implementation Smell-1: Magic Number 
Resolved](https://github.com/apache/commons-text/commit/c2f1ce1c22544d9c991e0116d681500080d518ce)
   
   Description- 
   The lookup() method in the FileStringLookup class contains a magic number 
literal (2) used as part of a conditional check to validate the format of the 
input key. However, using the raw value 2 directly in the condition reduces 
code readability and makes the logic difficult to understand or modify without 
external context. Therefore, Resolved this in this commit for better 
readability. 
   
   Commit 2- [Implementation Smell-2: Resolved Complex 
conditional](https://github.com/apache/commons-text/commit/ebf1c34da8422fa80fbdd5224ae4f2aafa62013a)
   
   Description- The method `translate` in ` NumericEntityUnescaper` contains 
complex conditional expression. The Expression is -
   input.charAt(index) == '&' && index < seqEnd - 2 && input.charAt(index + 1) 
== '#'
   Therefore, to simplify it, the logic was broken down into smaller, clearly 
named helper methods using Extract Method and Introduce Explaining Variable 
techniques. Conditions such as checking if the numeric entity starts correctly, 
identifying hexadecimal formats, and verifying the presence of a semicolon were 
moved to separate methods like isNumericEntityStart, isHexStart, and 
hasSemicolon. 
   
   Commit 3- [Implementation smell-3: Resolved Cognitive 
complexity](https://github.com/apache/commons-text/commit/aa07a148a6ca1f5547bd54b011295bb50e7eb20c)
   
   Description- The method `lastIndexOf` in ` TextStringBuilder` class has 
cognitive complexity. This method has conditions, nested loops, and checks. 
Hence, It became overly complex. The refactored lastIndexOf method reduces 
cognitive complexity by breaking down the original logic into smaller, 
well-named helper methods. Using Extract Method, repetitive and complex 
logic—like index adjustment, input validation, and the reverse substring 
search—was separated into adjustStartIndex, isInvalidInput, isSearchable, and 
searchFromEnd. Introduce Explaining Variable helps clarify the purpose of 
computed values, such as the adjusted start index. Additionally, Decompose 
Conditional is applied in searchFromEnd to clearly express the nested loop 
logic for matching characters from the end. This refactoring improves 
readability, testability, and maintainability by making each step of the logic 
explicit and modular.
   
   Commit 4- [Design smell-1: Resolved unnecessary abstraction in 
StringEscapeUtils…](https://github.com/apache/commons-text/commit/1f25a84d94f53f75ae74cd548cb3834190d72779)
   
   Description- 
   The XsiUnescaper class adds complexity without improving reusability, 
extensibility, or separation of concerns. It is tightly coupled to 
StringEscapeUtils and used exclusively to define UNESCAPE_XSI. Since 
XsiUnescaper is not reused elsewhere and is not designed for extension, the 
abstraction does not serve modular benefits. First, the complex logic inside 
the translate method was decomposed by extracting the logic of finding and 
writing segments between backslashes into a new helper method, improving 
clarity and reducing method length. Next, meaningful names like segmentStart, 
searchOffset, and pos were retained to maintain context, while their usage was 
clarified through comments or restructuring. Additionally, the BACKSLASH 
constant was kept as-is to preserve semantic clarity. These changes make the 
code easier to understand and maintain while preserving its original behaviour 
and logic.
   
   Commit 5- [Design Smell-2: Resolved SRP Violation in FormattableUtils 
Class](https://github.com/apache/commons-text/commit/cc76b76d16d8ae5dda8092a69bf2ebdd57e5d08d)
   
   Description- The Class `FormattableUtils` is God class which violates SRP 
(Single responsibility principle). To Resolve this design smell, firstly, I 
created a new helper class, namely `TruncatePadFormatter`, which will handle
   the logic of precision, ellipsis, and padding. It keeps `FormattableUtils` 
focused only on utility orchestration. The class `FormattableUtils` delegates 
padding/truncation logic to TruncatePadFormatter and moved logic-heavy append() 
method body into the newly created class. This solution also introduced 
PadStrategy with “LeftPadder” and “RightPadder”. This solution will improve 
code structure. 
   
   Commit 6- [Design smell-3: resolved feature envy in StringSubstitutorReader 
in 
d…](https://github.com/apache/commons-text/commit/b481d0cb98843e09b3e685d2819c58112bb986ef)
   
   Description- 
   The class StringSubstitutorReader in the commons-text library contains a 
Feature Envy smell in the method drain(). This method is overly dependent on 
the internal details of the TextStringBuilder class. It frequently accesses 
buffer.length(), buffer.isEmpty(), buffer.drainChars(), and buffer.size(), 
indicating that it operates more on the TextStringBuilder than on its own data, 
violating the principle of object-oriented encapsulation. 
   
   To resolve the Feature Envy smell in the StringSubstitutorReader class, 
firstly, by applying the Extract Method technique to separate the logic of 
interacting with the TextStringBuilder buffer into smaller, more meaningful 
methods, making the code easier to understand and reuse. Next, I used Decompose 
Conditional to break down complex if statements into simpler conditional 
checks, improving readability and comprehension. Then, I introduced Explaining 
Variable to assign meaningful variable names to expressions like 
buffer.length() or buffer.isEmpty(). Lastly, I used Rename Method/Variable to 
make method and variable names more descriptive of their behaviour in the 
class. 
   
   Commit 7 -  [Updated TruncatedPadFormatter file by adding licese 
header](https://github.com/apache/commons-text/commit/d03d8ea97811dddf1fe40e3b773224e718739dc6)
   
   Description- Updated  TruncatedPadFormatter by adding license header. 
   
   Hope this solution helps you. 
   
   Let me know if you need anymore changes to be done. If possible, please 
accept this pull request. 
   
   Thank you. 
   
   
   
   
   
   
   
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscr...@commons.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to