זה מבאס אבל ממש מבאס, ולמי שזה לא קרה עדיין שיצביע, אני מדבר כמובן על המצב שבו אתם יושבים וכותבים במשך שעה ארוכה פוסט מושקע עם דוגמאות, ואז כשהכול מוכן ל Publish, בלחיצת כפתור הכל נמחק.
אבל כמובן שנהיה חזקים ונשקיע עוד שעה מהחיים עבור הקהילה, ונכתוב את הכל מחדש.
אז אחרי שהתבכיינתי, נגש לעניין.
באחד הפוסטים הראשונים כתבתי על דרך להכריח את המתכנתים כשעושים switch על enum, לעשות case על כל האפשריות, ו Arielr כתב בתגובה "לא יהיה יותר קל לכתוב חוק של FXCOP ולסגור עניין?" אז חשבתי לעצמי, קדימה בוא נממש את זה, אז נכנסתי לעולם של FxCop, וממשתי את זה.
אז לפני שנראה מה זה בכלל FxCop ואיך מממשים את מה שאנחנו מדברים עליו, נראה קודם איך יראה הקוד שלנו.
נסתכל על הקוד הבא:
1 [ForceSwitch]
2 public enum MyEnum
3 {
4 A, B, C, D, E
5 }
6
7 public class Class1
8 {
9 public Class1(MyEnum myEnum)
10 {
11 switch (myEnum)
12 {
13 case MyEnum.C:
14 Console.WriteLine("");
15 break;
16 case MyEnum.B:
17 Console.WriteLine("");
18 break;
19 default:
20 Console.WriteLine("");
21 break;
22 }
23 }
24 }
C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\FxCopSdk.dll
C:\Program Files\Microsoft Visual Studio 9.0\Team Tools\Static Analysis Tools\FxCop\Microsoft.Cci.dll
1 internal class ForceSwitch : BaseIntrospectionRule
2 {
3 public ForceSwitch()
4 : base("ForceSwitch",
5 "SGFxCopRules.SGFxCopRules.xml",
6 typeof(ForceSwitch).Assembly)
7 { }
8
9 public override ProblemCollection Check(Member member)
10 {
11 Method method = member as Method;
12 if (method != null)
13 {
14 VisitMethod(method);
15 }
16
17 if (Problems.Count == 0)
18 {
19 return base.Check(member);
20 }
21
22 return Problems;
23 }
24
25 public override void VisitSwitchInstruction(SwitchInstruction switchInstruction)
26 {
27 TypeNode enumType = switchInstruction.Expression.Type;
28 foreach (var item in enumType.Attributes)
29 {
30 if (item.Type.Name.Name == "ForceSwitchAttribute")
31 {
32 if (switchInstruction.Targets.Count != enumType.Members.Count – 1)
33 {
34 Resolution resolution =
35 GetResolution(new string[]
36 {
37 enumType.Name.Name
38 });
39
40 Problems.Add(
41 new Problem(resolution,
42 switchInstruction.SourceContext));
43 }
44 }
45 }
46 }
47 }
1 <Rules FriendlyName="SGFxCopRules">
2 <Rule TypeName="ForceSwitch" Category="SGRules" CheckId="SGR1000">
3 <Name>ForceSwitch</Name>
4 <Description>You must implement all cases in the enum</Description>
5 <LongDescription></LongDescription>
6 <Owner/>
7 <Url>/ForceSwitch</Url>
8 <Resolution>Not all enum '{0}' cases were implented</Resolution>
9 <Email/>
10 <MessageLevel Certainty="99">Error</MessageLevel>
11 <FixCategories>NonBreaking</FixCategories>
12 </Rule>
13 </Rules>
1 public class ForceSwitchAttribute : Attribute
2 {
3
4 }
כל הכבוד על ההשקעה. באמת התפלאתי למה לקח כ"כ הרבה זמן…
אבל היה שוה לחכות.
לגבי העניין שכתבת בהתחלה שה-PUBLISH נמחק לך. פשוט תשתמש ב-LIVE WRITER במקום להשתמש ב-IE שאתה כותב פוסט.
http://get.live.com/writer/overview
הרבה יותר נוח יעיל ואפשר לשמור הכל על המחשב שלך.
שלמה, פוסט מעולה!!!
זה אמור להיות אחד הפוסטים הבאים שלי כי הבטחתי לקהל אצלי בהרצאה ב DEV ACADEMY שאפרסם כזה פוסט.
כל הכבוד על ההשקעה והשיתוף.
מאור
שימושי ביותר, תודה
אחלה!
רותם, תודה על ה Live Writer, זה מאוד עוזר
באיזו גרסה אתה משתמש (VS?)
משום מה אצלי גם לאחר התקנת FxCop אין לשונית "Code Analisis"
זה קיים כבר ב Visual Studio 2005
זה יותר משנה, איזה סוג פרויקט יש לך, אם יש לך פרויקט מסוע Web Site, אז אין באמת טאב של Code Analysis
רק אם תבחר ב
Propery Page->Build->Enable Code Analysis