-
-
Notifications
You must be signed in to change notification settings - Fork 132
Improve getKey method performance #136
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
Merged
Merged
Changes from 4 commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
86949d6
Add getKey() return type as string
simPod 8d8c6ec
Merge branch 'master' into improve_getKey_performance
drealecs 0ad4363
make assertValidValue private as it's not valuable to extend the API.…
drealecs edcc10d
cache the key value at construct changing from in_array to array_search
drealecs 4f2c572
move key property initialization in __wakeup in case an old version i…
drealecs b072dc2
re-add the public static method assertValidValue
drealecs be02f8d
optimize the from named constructor to have only one array full scan …
drealecs 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 hidden or 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 hidden or 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 |
---|---|---|
|
@@ -60,6 +60,14 @@ public function testFailToCreateEnumWithInvalidValueThroughNamedConstructor($val | |
EnumFixture::from($value); | ||
} | ||
|
||
public function testFailToCreateEnumWithEnumItselfThroughNamedConstructor(): void | ||
{ | ||
$this->expectException(\UnexpectedValueException::class); | ||
$this->expectExceptionMessage("Value 'foo' is not part of the enum " . EnumFixture::class); | ||
|
||
EnumFixture::from(EnumFixture::FOO()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I added one more test here to clearly mention |
||
} | ||
|
||
/** | ||
* Contains values not existing in EnumFixture | ||
* @return array | ||
|
@@ -316,7 +324,8 @@ public function testSerialize() | |
{ | ||
// split string for Pretty CI: "Line exceeds 120 characters" | ||
$bin = '4f3a33303a224d79434c6162735c54657374735c456e756d5c456e756d4669787'. | ||
'4757265223a313a7b733a383a22002a0076616c7565223b733a333a22666f6f223b7d'; | ||
'4757265223a323a7b733a383a22002a0076616c7565223b733a333a22666f6f223b73'. | ||
'3a32323a22004d79434c6162735c456e756d5c456e756d006b6579223b733a333a22464f4f223b7d'; | ||
|
||
$this->assertEquals($bin, bin2hex(serialize(EnumFixture::FOO()))); | ||
} | ||
|
@@ -344,19 +353,4 @@ public function testEnumValuesInheritance() | |
$inheritedEnumFixture = InheritedEnumFixture::VALUE(); | ||
new EnumFixture($inheritedEnumFixture); | ||
} | ||
|
||
/** | ||
* @dataProvider isValidProvider | ||
*/ | ||
public function testAssertValidValue($value, $isValid): void | ||
{ | ||
if (!$isValid) { | ||
$this->expectException(\UnexpectedValueException::class); | ||
$this->expectExceptionMessage("Value '$value' is not part of the enum " . EnumFixture::class); | ||
} | ||
|
||
EnumFixture::assertValidValue($value); | ||
|
||
self::assertTrue(EnumFixture::isValid($value)); | ||
} | ||
} |
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.
Uh oh!
There was an error while loading. Please reload this page.
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.
I propose to make private the newly public static method added in #135 as there was no new release so far.
I believe there is no need for have another public method as:
isValid()
static method.from()
can be used to have an exception thrown for invalid values.I want to easily re-use the method to return the key when a value is valid for further storing in constructor.
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.
@michaelpetri, let me know if this makes sense and if you envision any other use-case that I missed
Uh oh!
There was an error while loading. Please reload this page.
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.
I worked around it for now but did a change in from to optimize the construction.
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.
Sorry for my late response. imo no need to have it public since i just can call
from($mixed)
and get an enum or exception.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.
Sorry missed the return string part, imo the assert should not return anything. If no exception was thrown you know you have a valid key, or do i miss something?
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.
The current version of the PR is with an additional private method called
assertValidValueReturningKey()
that returns string and having the currentassertValidValue()
still there calling it.The operation does a full array scan and I would like to reuse the same array scan for retrieving the key in one operation, changing
in_array
witharray_search
.assertValidValueReturningKey()
would be called in ctor and infrom()
method as well.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.
Okay, now I understand what you want to achieve. From my side it's ok, even if I think it makes the codebase a bit more confusing. Would another static map (value => key) be an option here as well? Then you could lookup keys by
self::$otherMap[$value] ?? null
?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.
That would not work as values can be anything, not just int or string.
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.
Okay, so nothing more from my side. 🤐