Re: Creating a "public only" constructor
Dean Cleaver <[email protected]> Tue, 7 Apr 2009 08:47:02 +1200
| Newsgroups | gmane.comp.windows.devel.dotnet.advanced |
|---|---|
| Message-ID | <8E588B65FD82DF448592A3219102C395035CD2EE7B@SXSLAKL001.xceptionsoftware.com> |
Hadn't thought of trying something like FXCop - will have a closer look - thanx. -----Original Message----- From: Discussion of advanced .NET topics. [mailto:[email protected]] On Behalf Of Phil Sayers Sent: Tuesday, 07 April 2009 00:25 To: [email protected] Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor Do you have an automated build/test environment where you can include the fxcop analysis as part of a daily/weekly build? Have you looked at fxcop to see if you can create a custom rule to detect & alert when this ctor is used incorrectly? -----Original Message----- From: Discussion of advanced .NET topics. [mailto:[email protected]] On Behalf Of Dean Cleaver Sent: Monday, April 06, 2009 8:00 AM To: [email protected] Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor I guess I was hoping for a programmatic way to prevent the juniors screwing up rather than me having to babysit them, and just hoping they don't. It's a complex and annoying situation... I get told I should be spending more time reviewing their code, then get told I have to bill so many hours to get my bonus, then get told I have to train other people on unrelated things, and I have to do... and then I get told off for not "doing my job". -----Original Message----- From: Discussion of advanced .NET topics. [mailto:[email protected]] On Behalf Of Frans Bouma Sent: Monday, 06 April 2009 23:47 To: [email protected] Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > Yeah - but I guess it's not just now - it's ongoing. I *don't trust* the > juniors to be vigilant about using the right constructor, when it's so easy > to just "Class x = new class();" in that assembly. If they're junior's, they're learning. Which means they need guidance and can't always be left alone, that's why they're juniors. > When I say I don't trust them, I found 57 copies of the same code in one > solution - rather that put it in a base class (which already existed) they > made 57 copies of the same class. I don't have time (half the time not even > in the came country) to review all their work, but I can't rely on them to > be accurate. As you're not always around, who is guiding the juniors to become non-juniors? Juniors aren't senior engineers you can leave alone and expect good results. Unfortunately :( (I understand it's likely not your call and you're just dealing with a bad situation as-is, I'm just trying to help you even if it will sound like I am not helping you by working against what you want to do) FB > > Dino > > -----Original Message----- > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > [email protected]] On Behalf Of Dave Jones > Sent: Monday, 06 April 2009 23:16 > To: [email protected] > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > From reading all that has passed I would mark the default obsolete false and > the add treat warnings as errors into the main Code Base and the take the > hit and fix the compile errors that appear in the code. I've done a similar > thing when changing from home grown data layer to ms app blocks that was > half a million lines of code, 700 plus errors fixed. Dave. > > > > > > > -----Original Message----- > From: Dean Cleaver <[email protected]> > > Date: Mon, 6 Apr 2009 22:12:12 > To: <[email protected]> > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > It is template based - but a bespoke generator. > > "As is't the default ctor you're worried about, it's easy to spot with > search/replace" > > Not with over 500 classes in 3 million lines of code it's not. > > There is no order of constructors. The "normal" apps which consist of about > 5 Windows Applications and 15 to 20 Web applications always use the > defaults, as has be the case for the past 8 or 9 years. Using the defaults > causes the underlying class factory to use the defaults also, which is > perfect for those apps. > > The scenario we have is we need to instantiate the same class on 2 different > servers, and clone one to the other. My issue is if I instantiate an Invoice > class using the second constructor to point it directly to it's server, that > the existing code might not point all child objects to the same server if > they call the default constructor. And there is 8 to 10 years worth of code > already in there, so there is a *VERY* high chance that it uses the default > constructor. Hence why I was looking for a way to "block" the default > constructor from being used insite the assembly. > > Trust me - if the default cannot be blocked, then there are no other > options. Search and replace is not an option. Even putting attributes or > demands on the constructors requires someone to hand code all 500 > constructors... > > Dino > > -----Original Message----- > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > [email protected]] On Behalf Of Frans Bouma > Sent: Monday, 06 April 2009 20:34 > To: [email protected] > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > If it were a new design yes - but it's not. The code generation has > allowed > > for this separate server capability, but I fear it cannot be utilised > fully > > because the code was historically never designed to work with it, and > > without hundreds of hours of trawling through the current codebase it > can't > > be successfully changed to a class factory type scenario. > > If the code generation was template based, you might be able to do > something about it, but I'm not sure how it's generated. > > Refactoring the code might be simpler than you might think. As is't > the default ctor you're worried about, it's easy to spot with > search/replace. if you load the codebase into vs.net, and do find/replace in > files, and replace the call to the empty ctor to a call to a factory, the > only thing that's to solve after that is the references to the right > namespace where the factory is located. You can also spot calls to the > second ctor with a simple regex in the find/replace dialog in vs.net. > > But I still don't fully understand what the order is in which the > ctors are used. As I understand it, it seems that if I want to instantiate > an invoice, I use the empty ctor of Invoice. And if I want to instantiate an > invoiceitem, I use the parameter-using ctor in invoice, and you want to > prevent that the invoiceitem empty ctor is used, correct? > > If you replace calls to both ctors to a call to a factory and make > both ctors internal, you have full control over when what is called. > However, I am a bit puzzled why the empty ctor is supposed to be public if > instantiating an invoiceitem is always dependent on the invoice itself (as > instantiating it on the same server as the invoice is always the best idea) > > FB > > > > > Dino > > > > -----Original Message----- > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > [email protected]] On Behalf Of Frans Bouma > > Sent: Monday, 06 April 2009 19:57 > > To: [email protected] > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > Dean, > > > > I have the feeling the concern whether OTHER objects are created on > > the > same > > server is not the concern of the class you want to instantiate but the > > concern of a repository or other object. I know you're facing a large > > pile of code, but you have to make a change somewhere anyway. I'd > > factor out > this > > concern from this class and create factories to produce the proper > instances > > on the right server/service. > > > > FB > > > > > Hmm - yeah. Not a bad idea... but would mean that only the Business > > Services > > > layer would ever compile in that release, and everything else would > fail. > > > > > > -----Original Message----- > > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > > [email protected]] On Behalf Of Dave Jones > > > Sent: Monday, 06 April 2009 19:31 > > > To: [email protected] > > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > Wrap the constructor in a #if release? Then it won't be available in > > > debug? > > > > > > Dave > > > > > > > > > > > > > > > -----Original Message----- > > > From: Dean Cleaver <[email protected]> > > > > > > Date: Mon, 6 Apr 2009 16:02:43 > > > To: <[email protected]> > > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > > > > The second constructor allows you to create a business services > > > object on > > a > > > different connection to the default - so I can specifically create > > business > > > services objects connected to 2 different servers from within the > > > same application. I then want to ensure that if I create an Invoice > > > object on a given server, than any InvoiceItems it creates are on > > > the same server, > > which > > > would be done by using the second constructor. If a developer > > > accidentally uses the default constructor, it could make a mess of > > > the > > system. > > > > > > -----Original Message----- > > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > > > [email protected]] On Behalf Of Shawn Wildermuth > > > Sent: Monday, 06 April 2009 15:55 > > > To: [email protected] > > > Subject: Re: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > I don't think you can. Can you explain why you want to protect it > > > from internal classes? > > > > > > Thanks, > > > > > > Shawn Wildermuth > > > http://wildermuth.com > > > https://agilitrain.com > > > Microsoft MVP (C#), MCSD.NET, Author and Speaker > > > > > > The Silverlight Tour is coming to a city near you! > > > > > > > > > -----Original Message----- > > > From: Discussion of advanced .NET topics. > > > [mailto:[email protected]] On Behalf Of Dean > > > Cleaver > > > Sent: Sunday, April 05, 2009 11:42 PM > > > To: [email protected] > > > Subject: [ADVANCED-DOTNET] Creating a "public only" constructor > > > > > > Hey, anyone know if you can do this with attributes or something? I > > > want > > to > > > have 2 public constructors: > > > > > > public ClassName() > > > { > > > } > > > > > > public ClassName(some param) > > > { > > > } > > > > > > I want both publically accessible, but I want the default one > > *inaccessible* > > > internally. Can that be done? > > > > > > Dino > > > > > > =================================== > > > View archives and manage your subscription(s) at > > > http://peach.ease.lsoft.com/archives > > > > > > =================================== > > > View archives and manage your subscription(s) at > > > http://peach.ease.lsoft.com/archives > > > > > > =================================== > > > View archives and manage your subscription(s) at > > > http://peach.ease.lsoft.com/archives > > > > > > =================================== > > > View archives and manage your subscription(s) at > > > http://peach.ease.lsoft.com/archives > > > > =================================== > > View archives and manage your subscription(s) at > > http://peach.ease.lsoft.com/archives > > > > =================================== > > View archives and manage your subscription(s) at > > http://peach.ease.lsoft.com/archives > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives