|
Adam Jasper wrote: I have read some articles that suggest they should no be used.
Well that's not what I said. It's not object oriented is what I said, that doesn't mean you shouldn't do it, it only means you should understand the ramifications of a non object oriented solution in that particular context and make an informed decision. One example of what a non object oriented solution means is, you will have to change existing code to extend functionality rather than implement a new class that encapsulates the new functionality. In your case for example you have to change the enum and likely code that uses the enum, this is likely what you have read others saying you should not do and can also be referred to as Technical Debt[^].
All that said, there are Software Design Patterns that can be used to avoid the enum approach you have implemented. Utilizing these patterns normally allows you to implement a OO design where introducing a new class is all that is required to extend functionality. No existing code is changed. The historically proven benefit of that is an increase in quality. This means reduced ripple effect and less chance of errors that result in system failure. The larger and therefore more complex a system is the greater the odds become of resultant errors due to Technical Debt. Furthermore studies have proven that the cost to the company of dealing with errors can be 100 fold greater than doing the upfront design and development to eliminate the Technical Debt.
No doubt since you have been doing this for 12 years and read all sorts of stuff you already know all that.
led mike
|
|
|
|
|
Yes, enums do violate the open/closed principle as they cannot be extended. However, as long as you only add new values to the end of the enum and do not change any existing values I think it is generally considered to be acceptable to use enums in OOD. I have yet to see a design pattern that solves this problem completely, what design patterns are you referring to?
You are correct to say it is a design decision. I do make some rules that I adhere to myself regarding enums i.e. I never cast to another type to iterate through the values because this could break existing code if I add a new value to the end. I do need to modify classes to check for a new enum value, however, I only add code, I don't change existing code. Therefore, if I cannot say my design is object oriented then so be it. It is a lot simpler than any of the other alternatives I have seen.
Thanks for your comments,
Adam
|
|
|
|
|
led mike wrote: Experienced in what, breathing?
led mike wrote: is not object oriented
To be fair he never said it was: he really only asked if it was understandable or too complicated, which, of course , for VB 'programmers', it is.
|
|
|
|
|
digital man wrote: To be fair he never said it was:
The what does that subject line say?
led mike
|
|
|
|
|
Um, yes I suppose one could read it that way: interpretation is everything. I ignored the heading and concentrated on the question: my mistake.
|
|
|
|
|
You have something like this?
public SimpleBusinessEntity Save(SimpleBusinessEntity entity)
{
switch(entity.EntityType)
{
case EntityType.TariffEntity:
tariffWorkflow.Save((TariffEntity)entity);
break;
case EntityType.Contract:
contractWorkflow.Save((Contract)entity);
break;
default:
Debug.Fail();
break;
}
}
Is this more or less correct?
In an object oriented approach, you use polymorphism to do the dispatching. This means creating several Save methods, one for each type:
public void Save(TariffEntity entity)
{
}
public void Save(ContractEntity entity)
{
}
The general consensous is that it's easier to maintain the latter approach than the long switch statements. This is especially true if you have several switch statements duplicate switch statements throughout your code.
Having said this, there are times where switch statements are appropriate. At the boundary of an application (which may apply here) you may find yourself having to switch on data in order to transform it into a form the rest of the application can use. For one thing, C# doesn't support double dispatching, so having several Save methods like the above may not work.
At any rate, hope something in the above provides some insight.
|
|
|
|
|
Hi Leslie,
Thanks for your comments, much appreciated. I don't actually need to use a switch statement in this case. I try and avoid it where possible. Really the only time I use a switch statement is in a factory class, I can't think of a way around it in some instances.
I'll explain how I have avoided a case statement with code snippets (this is off the top of my head as I don't have the actual code to hand at the moment):
private Dictionary<BusinessEntityType, IEntityWorkflow> _workflows;<br />
<br />
public PersistenceWorkflow()<br />
{<br />
_workflows = new Dictionary<BusinessEntityType, IEntityWorkflow>();<br />
<br />
InitialiseEntityWorkflows();<br />
}<br />
<br />
protected virtual void InitialiseEntityWorkflows()<br />
{<br />
_workflows.Add(BusinessEntityType.Tariff, new TariffWorkflow());<br />
_workflows.Add(BusinessEntityType.Contract, new ContractWorkflow());<br />
}<br />
<br />
then, the actual save method is something like this:
public SimpleBusinessEntity Save(SimpleBusinessEntity entity)<br />
{<br />
IEntityWorkflow workflow = _workflows[entity.EntityType];<br />
return workflow.Save(entity);<br />
}
The implementation of the IEntityWorkflow.Save method in TariffWorkflow would cast to the relevant type e.g. TariffEntity.
I know the one disadvantage of this design is that I am instantiating more objects than I am going to use, however, I think it is a small price to pay for a very extensible design and I will never have that many entity workflows.
Regards,
Adam
|
|
|
|
|
Ah, I see. You've created a table with the enumeration values acting as indexes into the table; it's a dispatch table.
That's ok, but what you're doing is recreating the virtual table that C# gives you for free using polymorphism. I'm not advocating that you change this; if it's working for you, stick with it. Just be aware that when using virtual methods, the language creates the table for you internally.
Having said that, there have been times when I've used similar approaches, usually to make up for C#'s lack of double dispatching (and I don't feel like implementing Visitor).
|
|
|
|
|
Hi Leslie,
Thanks again for your comments.
I did originally want to use the Visitor pattern but I will extend the application with more elements and I think that is where the Visitor pattern falls down. I did look at another pattern, a quick search on Google tells me it was called Acyclic Visitor, however, it didn't tick all the boxes either.
Regards,
Adam
|
|
|
|
|
How can i make good s-box easily (against linear and differential attacks)? If i used prepaid one that may belongs to someone or standard ciphers then it would be plagiarism right? So i need to make own s-box (8 bit input, 8 bit output (16x16)). Please Please suggest me any way to decide it. Thank you.
|
|
|
|
|
What's an s-box?
"The pursuit of excellence is less profitable than the pursuit of bigness, but it can be more satisfying."
- David Ogilvy
|
|
|
|
|
The s-box in cryptography is named like Substitution box (a.k.a substitution table).
|
|
|
|
|
Ahh..out of my area of expertise then.
"The pursuit of excellence is less profitable than the pursuit of bigness, but it can be more satisfying."
- David Ogilvy
|
|
|
|
|
Use standard ciphers. Fiddling with your own substitutions might accidently introduce weakness. The framework provides a whole bunch of CSPs you can use royalty free anyway - theres very little reason to implement your own cipher, and lots of reasons not to.
|
|
|
|
|
We have a web app that is developed using VB, ASP and SQL SERVER. Some parts (10-15%) of the web app are developed using asp.net 1.1.
Now, we want to:
- move one of the modules say CRM to asp.net 2.0 that is written in VB and ASP.
- support the CRM module written in VB and ASP until the re-written module using .net is ready to use.
- incorporate any changes happen in old code into new .net code immediately.
- Leverage the power of AJAX AND Windows workflow foundation
Existing system:
- The CRM module uses others DLLS written in VB and vice-versa.
- We have all the classes required for CRM DLL developed in VB. Example :> Let say we have a biz object class which contains all the biz attributes (properties) as well as methods and called from ASP page. We also have a corresponding data object class which has only corresponding methods as Biz object and interacts with DB and return the results to Biz object.
- We have all screens required for CRM developed using ASP and JAVASCRIPT.
As a .Net senior developer, my responsibilities include:
1 - Create all CRM VB classes in C# to improve performance, better use technology, and remove redundancy
2 - Analyze the classes and Apply design pattern wherever possible
3 - There must be not any problem when the CRM module is completely re-written as the new .net dll for CRM should be able to call other VB DLLS and vice versa.
4 - All pages for CRM module must be re-written using ASP.NET, AJAX and Windows workflow foundation
Need suggestions:
- Should I do requirement analysis again or it is not required since the requirement is already there.
- Should I create all the VB Biz classes as it in C# and then apply design pattern wherever possible.
- Should I create the Net wrapper DLLS for all the VB DLLS that need to be referred by CRM .Net DLL and vice-versa.
- No problem if I use AJAX AND WORKFLOW
Please let me know if you have other suggestions.
|
|
|
|
|
Hi guys!
Can anyone point me to a good tool that would help to generate a structured list of functional requirements (features) such as found in software requirements specifications (SRS)? I can type all that in Word, but it's a hassle and I'am looking for a more automated way to do those lists.
What I am looking for is an app where I could:
1. Enter a new feature/requirement. This gets an ID, etc.
2. Enter some other requirements. The list is growing...
3. Link requirements, so they are visible in a tree-like structure, say REQ-3-2-2 depends on REQ-3-2-1, something like that.
If I could export that to Excel or generate a report it would rock.
I saw a web based application once which allowed the user to create a list of requirements like this and do some (interactive!) mockups, I believe I got it in CP newsletter a few months ago and I can't remember the name, neither I have it in my mailbox. I know it started with "S" (not very helpful, eh?).
|
|
|
|
|
Hello everybody!
I'm designing an application that generates some results after doing analytics processes. Then the results can be saved into different formats (like TXT,XML,EXCEL,etc...) and with different formats, deppending user options and the format of data file selected.
How do you think is the best way to dessign this part? I'm thinking about using the Factory Pattern, about creating and passing the data to each especific class (one per each file format), and a Decorator pattern that adds the optional data configured by de user.
But I don't know if I'm thinking in the best way. Could you bring some ideas?
Thank you.
|
|
|
|
|
I produce XML, then XSLT can transform it to other formats, such as HTML and CSV.
Excel can read CSV so don't bother writing XLS directly.
|
|
|
|
|
Thanx for your reply. Y will consider this option.
|
|
|
|
|
Keep the analytical data in Director.
Give format to your data using Builder.
Builder pattern.
|
|
|
|
|
Please let me know what is a properties file and what does it contain.
I have to create a propeties file which I would be using in my program. Please help me how should I create a properties file.
thanks.
|
|
|
|
|
If you don't know what a properties file is, how do you know that you're supposed to make one?
|
|
|
|
|
|
|
Hi guys
Does anyone know where we can find very accomplished Biztalk developers and architects? We have a nice opportunity for them over here....
thanks
steve
|
|
|
|